日期:2014-05-17  浏览次数:20404 次

SQLSERVER锁
谢谢大家了,这个问题怎么解决?分不多了,只能给这些了
事务一:
begin tran
select * from A;
waitfor delay '00:00:30';
commit tran
事务二:
begin tran
update Aset A.X=A.X+100;
waitfor Delay '00:00:15';
select * from A;
commit tran
事务一执行后,立马执行事务二,为什么事务二没有在45秒以后执行,而是在15秒之后执行呢?事务一对A表加上S锁,持续时间是30秒,且先加上S锁,事务二后加上X锁,S锁与X锁不相容,为什么会出现这样的情况?谢谢博主抽出时间帮我回答这个问题。

------解决方案--------------------
你这种好像就叫脏读还是幻读,高级版本的SQLServer已经引入了行版本隔离级别。所以查询的时候可能查询的是更改数据前锁保留的“快照”,当你再执行的时候,数据又变成已经更新后的数据了。
------解决方案--------------------
会,s锁只是不阻塞s锁而已,但是锁还分为事务完毕之后释放和语句完毕之后释放两种情况的。我具体不是很记得是哪种对应哪种,先将设s锁是语句完毕之后释放,当你select足够快的时候,其实实质上是释放了S锁,那么update就没有被阻塞了。你可以在执行事务的时候,在第三个窗口看看两个事务获取和释放锁的实际情况:
SQL code
SELECT * FROM sys.dm_tran_locks