表结构
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'
这句语句是不是代表在一个事务里加上两个锁?
与上面的情况:事务一和事务二分别加锁 有什么不同呢?
http://www.cnblogs.com/HeroTan/p/4503795.html
holdlock表明要将共享锁持有到事务结束,而不是在当前语句执行完就释放。只是表明一种锁的状态,而不是真正意义的锁
U锁和S锁是不冲突,但U锁是S+X锁,在S阶段,和其他S锁兼容,因此可以实现并行查询,但当U锁中的S部分执行完成,需要转化成X锁后(之前是S+IX),会阻塞其他S锁。
换句话,U锁不是一个常态存在的,是从S+IX-->X的一个转化过程;
首先非常感谢你的回答!!我是个菜鸟,对于你对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锁也无法对其作更新锁锁定呢?
@Zakero: TAB上的IX,就说明这个表有意向更新锁,只是在更新行的时候以U来表示
关于你的几点疑问
@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不冲突