首页 新闻 会员 周边 捐助

updlock 阻塞 holdlock吗

0
悬赏园豆:20 [已解决问题] 解决于 2015-05-14 17:08

表结构 

AB

1 2
3 4

 

事务一:

begin tran
select * from dbo.Lock1 WITH (UPDLOCK) where a='1' 
waitfor delay '00:00:05'
commit tran

事务二:

begin tran

select * from dbo.Lock1 WITH (HoldLock) where a='1' 
commit tran

 

U锁与S锁不是不冲突的吗?

为什么事务二会等到事务一执行完毕才能执行?

 

select * from dbo.Lock1 with(Updlock,HoldLock) where  a='1'

这句语句是不是代表在一个事务里加上两个锁?

与上面的情况:事务一和事务二分别加锁  有什么不同呢?

Zakero的主页 Zakero | 初学一级 | 园豆:186
提问于:2015-05-13 15:55
< >
分享
最佳答案
0

http://www.cnblogs.com/HeroTan/p/4503795.html

Zakero | 初学一级 |园豆:186 | 2015-05-14 17:07
其他回答(1)
0

holdlock表明要将共享锁持有到事务结束,而不是在当前语句执行完就释放。只是表明一种锁的状态,而不是真正意义的锁

U锁和S锁是不冲突,但U锁是S+X锁,在S阶段,和其他S锁兼容,因此可以实现并行查询,但当U锁中的S部分执行完成,需要转化成X锁后(之前是S+IX),会阻塞其他S锁。

换句话,U锁不是一个常态存在的,是从S+IX-->X的一个转化过程;

收获园豆:20
我是大菠萝 | 园豆:365 (菜鸟二级) | 2015-05-14 10:59

首先非常感谢你的回答!!我是个菜鸟,对于你对U锁的“是从S+IX-->X的一个转化过程”这种概念,我还是第一次看到。

回到我的问题:

begin tran
select * from dbo.Lock1 WITH (UPDLOCK) where a='1' 
waitfor delay '00:00:05' 
commit tran

 

单单执行第一个事务

在整个事务的wait过程中都没有变成X锁呀。。

你说的"U锁中的S部分执行完成",是指整个事务完成呢,还是指select语句的执行完成?

我还有几点疑问:

1."通常是加S锁的数据被读取完毕,S锁立即被释放。"

这句话所说的“数据被读取完毕”,是具体到select语句的执行完毕,还是事务的完毕呢?

 

2.如果事务只有1条select * table with(updlock),不是表明要将更新所持有到事务结束吗?

 

3.http://www.cnblogs.com/adforce/archive/2011/04/20/2021929.html

里面对 更新锁的解析

 更新锁(Update Lock)
      更新锁是为了防止死锁而设立的。当SQL Server 准备更新数据时,它首先对数据对象作更新锁锁定,这样数据将不能被修改,但可以读取。等到SQL Server 确定要进行更新数据操作时,它会自动将更新锁换为独占锁。但当对象上有其它锁存在时,无法对其作更新锁锁定。

"但当对象上有其它锁存在时,无法对其作更新锁锁定"

是不是对象上只有S锁也无法对其作更新锁锁定呢?

 

支持(0) 反对(0) Zakero | 园豆:186 (初学一级) | 2015-05-14 14:13

@Zakero: TAB上的IX,就说明这个表有意向更新锁,只是在更新行的时候以U来表示

关于你的几点疑问

支持(0) 反对(0) 我是大菠萝 | 园豆:365 (菜鸟二级) | 2015-05-28 10:34

@Zakero: TAB上的IX,就说明这个表有意向更新锁,只是在更新行的时候以U来表示

关于你的几点疑问

1、在select执行完成,S锁即被释放,不会保持到事务结束

2、updlock是会持续到事务结束才释放

3、按你表中的解释,S锁和U锁是不冲突的

你可以进行这样测试,

SPID_A

begin tran

select * from tb with(holdlock)

waitfor delay '00:00:30'

 

SPID_B

select * from tb with(updlock)

 

先执行SPID_A,再执行SPID_B,可以发现S和U不冲突

支持(0) 反对(0) 我是大菠萝 | 园豆:365 (菜鸟二级) | 2015-05-28 10:45
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册