当前位置:数据库 > 数据库管理> 正文

Sql Server 更新锁

时间:2015-1-26类别:数据库

Sql Server 更新锁

Sql Server 更新锁

更新锁的意思是:“我现在只想读,你们别人也可以读,但我将来可能会做更新操作,我已经获取了从共享锁(用来读)到排他锁(用来更新)的资格”。一个事物只能有一个更新锁获此资格。
 

Sql Server 更新锁实例

为下面描述方便,这里用T1代表一个数据库执行请求,T2代表另一个请求

 

1、实例1

 

  •  
  • SQL 代码   复制
  • 
    T1:
    
    begin tran
    select * from table(updlock) --(加更新锁)
    
    			

    update table set column1='hello'

     

    T2:

    begin tran

    select * from table(updlock)

    update table set column1='world'

     

  • 分析

    T1执行select,加更新锁。 T2运行,准备加更新锁,但发现已经有一个更新锁在那儿了,只好等。 当后来有user3、user4...需要查询table表中的数据时,并不会因为T1的select在执行就被阻塞

     

    2、实例2

     

  •  
  • SQL 代码   复制
  • 
    T1:select * from table(updlock)    --(加更新锁)
    
    			

    T2: select * from table(updlock) --(等待,直到T1释放更新锁,因为同一时间不能在同一资源上有两个更新锁)

    T3: select * from table --(加共享锁,但不用等updlock释放,就可以读)

     

  • 说明

    共享锁和更新锁可以同时在同一个资源上。这被称为共享锁和更新锁是兼容的。

     

    3、实例3

     

  •  
  • SQL 代码   复制
  • 
    T1:
    
    begin
    select * from table(updlock)      --(加更新锁)
    
    			

    update table set column1='hello' (--重点:这里T1做update时,不需要等T2释放什么,而是直接把更新锁升级为排他锁,然后执行update)

     

    T2:

    begin

    select * from table --(T1加的更新锁不影响T2读取)

    update table set column1='world' --(T2的update需要等T1的update做完才能执行)

     

  • 分析

     

  • 第一种情况:T1先达,T2紧接到达;在这种情况中,T1先对表加更新锁,T2对表加共享锁,假设T2的select先执行完,准备执行update,发现已有更新锁存在,T2等。T1执行这时才执行完select,准备执行update,更新锁升级为排他锁,然后执行update,执行完成,事务结束,释放锁,T2才轮到执行update。
  •  
  • 第二种情况:T2先达,T1紧接达;在这种情况,T2先对表加共享锁,T1达后,T1对表加更新锁,假设T2 select先结束,准备update,发现已有更新锁,则等待,后面步骤就跟第一种情况一样了。
  •  
  •  
  • 说明
  •  
  • 排他锁与更新锁是不兼容的,它们不能同时加在同一子资源上。
  •  
  •  
  • 标签:
    上一篇下一篇

    猜您喜欢

    热门推荐