记录一下对问题的探索,顺便回答一下自己提出的问题:http://q.cnblogs.com/q/72033/
本人菜鸟,看了这篇文章:http://www.cnblogs.com/adforce/archive/2011/04/20/2021929.html 后对锁和事务隔离级别有了基本的了解。
然后对自己提出的问题的探索中,又看到了这篇文章:http://www.cnblogs.com/xwdreamer/archive/2012/09/19/2694161.html 对意向锁也有了更深一步的了解。
感谢以上两位博主的分享。
好,回到对自己问题的解答:
表结构
A B
1 2
3 4
事务一:
begin tran
select * from dbo.Lock1 with(updlock) where a=‘1‘
waitfor delay ‘00:00:05‘
rollback
事务二:
begin tran
select * from dbo.Lock1 with(holdlock) where a=‘1‘
rollback
执行 sp_lock 查看信息。
首先,先单独查看使用updlock 的信息
begin tran
select * from dbo.Lock1 with(updlock) where a=‘1‘
waitfor delay ‘00:00:05‘
rollback
注意:这里申请了TAB的IX锁
关注61进程
然后再单独查看使用HoldLock的信息
begin tran
select * from dbo.Lock1 with(HoldLock) where a=‘1‘
waitfor delay ‘00:00:05‘
rollback
注意:这里申请了TAB的S锁
关注60进程
对于自己之前提出来的问题:
U锁与S锁不是不冲突的吗?
为什么事务二会等到事务一执行完毕才能执行?
之前的想法:知道U锁与S锁不冲突,事务一只加上了U锁,事务二只想加上S锁,为什么就会阻塞呢?
后来查阅了更多的资料,发现之前自己的想法只是停留在 锁发生在 RID 的局限上。 MSDN:https://msdn.microsoft.com/zh-cn/library/ms187749.aspx
但是事务一和事务二之间发生的阻塞存在于 RID,PAG和,TAB 或者其他更多。
----------------------------------------------------------------------------------------------------
锁的请求状态:
CNVRT:锁正在从另一种模式进行转换,但是转换被另一个持有锁(模式相冲突)的进程阻塞。
GRANT:已获取锁。
WAIT:锁被另一个持有锁(模式相冲突)的进程阻塞。
------------------------------------------------------------------------------------------------------
执行事务一和事务二:
根据上面两次单独的信息查看
事务一申请了TAB的IX锁,事务二申请TAB的S锁。
事务一先申请了TAB的IX锁,事务二过来先申请了IS锁,然后想由IS锁上升到S锁,但是IX锁与S锁是冲突的 红色框住:CNVT
所以阻塞了。。。
上面是先执行Updlock再执行HoldLock
以下是反过来的:
先申请TAB IS锁 ,后想申请IX锁,IS锁和IX也是冲突的。红色框住:WAIT
以上只是个人的理解,如果哪里有理解不正确或者用词不当的地方,希望有心人帮我指出。在此谢过!