Sql Server 更新锁
Sql Server 更新锁
更新锁的意思是:“我现在只想读,你们别人也可以读,但我将来可能会做更新操作,我已经获取了从共享锁(用来读)到排他锁(用来更新)的资格”。一个事物只能有一个更新锁获此资格。
Sql Server 更新锁实例
为下面描述方便,这里用T1代表一个数据库执行请求,T2代表另一个请求
1、实例1
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
T1:select * from table(updlock) --(加更新锁)T2: select * from table(updlock) --(等待,直到T1释放更新锁,因为同一时间不能在同一资源上有两个更新锁)
T3: select * from table --(加共享锁,但不用等updlock释放,就可以读)
说明
共享锁和更新锁可以同时在同一个资源上。这被称为共享锁和更新锁是兼容的。
3、实例3
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做完才能执行)
分析