要加上HoldLock,否则在默认的Read Committed层级下,select语句一执行完,锁就釋放了. begin tran select * from tb with(xlock,holdlock) where .... 其它操作... commit tran
这个是地该整个表锁定还是where条件符合的锁顶哦?
HoldLock是对整个表的吗``有针对表中某行的,并且在这个事务执行完后才释放锁的吗?
不是针对整个表, HoldLock是指保持该锁到交易结束.WITH (XLOCK,PAGLOCK) --锁定符合Where条件记录所在的页,并保持到交易结束WITH (XLOCK,HOLDLOCK) --锁定符合Where条件的记录,并保持到交易结束.EX:--(1) begin tran select * from orders with(xlock,paglock) where orderid=10252--执行完过後,用sp_lock查看会发现整个orderid=10252所在页都会加上X锁 --(2) begin tran select * from orders with(xlock,holdlock) where orderid=10252 --执行完过後,用sp_lock查看会发现只锁住了orderid=10252一行, 该行所占的页会有个意向X锁. lz慢慢体会吧
锁后其他事务就不能对where后面的进行update delete insert了吗?可以select吗?
要加上HoldLock,否则在默认的Read Committed层级下,select语句一执行完,锁就釋放了.
begin tran
select * from tb with(xlock,holdlock) where ....
其它操作...
commit tran
这个是地该整个表锁定还是where条件符合的锁顶哦?
HoldLock是对整个表的吗``有针对表中某行的,并且在这个事务执行完后才释放锁的吗?
HoldLock是指保持该锁到交易结束.WITH (XLOCK,PAGLOCK) --锁定符合Where条件记录所在的页,并保持到交易结束WITH (XLOCK,HOLDLOCK) --锁定符合Where条件的记录,并保持到交易结束.EX:--(1)
begin tran
select * from orders with(xlock,paglock) where orderid=10252--执行完过後,用sp_lock查看会发现整个orderid=10252所在页都会加上X锁
--(2)
begin tran
select * from orders with(xlock,holdlock) where orderid=10252
--执行完过後,用sp_lock查看会发现只锁住了orderid=10252一行, 该行所占的页会有个意向X锁.
lz慢慢体会吧
这里的 "整个orderid=10252所在页" 指什么`````