zoukankan      html  css  js  c++  java
  • Updlock 与 Holdlock

    记录一下对问题的探索,顺便回答一下自己提出的问题: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

    以上只是个人的理解,如果哪里有理解不正确或者用词不当的地方,希望有心人帮我指出。在此谢过!

     ————————————————————————————————————————我是分割线 ————————————————————————————————————————

    2016/3/14

    今天递了辞职信.

    又研究回之前的死锁问题........因为这是我在这家公司的一个梗,没有解决的梗。

    好了,确定是以上两个进程。

    查表:select * from dbo.Lock1

     --holdlock :将共享锁保留到事务完成,而不是在相应的表、行或数据页不需要时就立即释放锁。holdlock等同于serializable
     --updlock(有用 select ):读取表时使用更新锁,而不使用共享锁,并将锁一直保留到语句或事务的结束。updlock的优点是允许读取数据(不阻塞其他事务)并在以后
     --更新数据,同时确保自从上次读取数据后数据没有被更改


    执行接下来的的语句前,先看一下这条语句执行效果:

    Begin Tran
    select * from dbo.Lock1 with(holdlock,rowlock) where A='1'
    WaitFor Delay '00:01:00';

    看71spid,有个S锁....

    看回上面已经提到的的语句:

    begin tran

    select * from dbo.Lock1 with(HoldLock) where a='1' 
    waitfor delay '00:00:05'

    跟上图一样执行效果。

    执行:

    Begin Tran
    select * from dbo.Lock1 with(UPDLOCK,holdlock) where A='1'
    WaitFor Delay '00:01:00';

    再看71spid,TYPE='TAB'的只有一条(是不是没有rowlock的原因?)

    到目前为止,虽然个人认为的解决办法就是加两个锁一起加 select * from dbo.Lock1 with(UPDLOCK,holdlock) where A='1' ,但是分析过后好像不科学。。

    因为没有看到想要的执行结果:

    71   80   2137058   0   TAB   S  GRANT

    71   80   2137058   0   TAB   U  GRANT

  • 相关阅读:
    php 判断字符串是否以某字符串结尾的方法
    且看新手如何快速新站优化(经验+求指导+找喷) 西安
    xml 序列化和反序列化 西安
    反射+xml 序列化 实际应用 西安
    使用自定义文件缓存提升ASP.NET项目性能 西安
    反射的简单应用(记录) 西安
    java web 中的 controller、service、persistence(mapper)、domain 分别是什么作用?
    nodesass 替换为 sass
    github 访问不了 访问 github,修改 hosts 文件方法
    win10 如何使用管理员权限编辑文件
  • 原文地址:https://www.cnblogs.com/HeroTan/p/4503795.html
Copyright © 2011-2022 走看看