谢谢大家了,这个问题怎么解决?分不多了,只能给这些了
事务一:
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锁不相容,为什么会出现这样的情况?谢谢博主抽出时间帮我回答这个问题。

解决方案 »

  1.   

    什么叫S锁和X锁,事务操作在整个事务完成提交之前是会将操作的表锁起来的,你讲的X锁 是什么?
      

  2.   

    你好,select默认使用的是S(共享锁)锁,update使用的是X(排它锁)锁,共享锁和排它锁不能兼容,因为我是先在第一个查询窗口里面运行S锁的,接着在第二个查询窗口运行X锁的,按我的理解,X锁应该在S锁事物结束之后才能运行,为什么他会先把表的内容给改变呢?谢谢你的回答
      

  3.   

    你这种好像就叫脏读还是幻读,高级版本的SQLServer已经引入了行版本隔离级别。所以查询的时候可能查询的是更改数据前锁保留的“快照”,当你再执行的时候,数据又变成已经更新后的数据了。
      

  4.   

    你也知道x锁是会阻塞其他操作,所以阻塞了其他操作,先进行update,这样事务一查询的就是已经更新后的数据了。
      

  5.   

    我知道会X锁阻塞其他锁,但是难道S锁不阻塞X锁吗?
      

  6.   

    会,s锁只是不阻塞s锁而已,但是锁还分为事务完毕之后释放和语句完毕之后释放两种情况的。我具体不是很记得是哪种对应哪种,先将设s锁是语句完毕之后释放,当你select足够快的时候,其实实质上是释放了S锁,那么update就没有被阻塞了。你可以在执行事务的时候,在第三个窗口看看两个事务获取和释放锁的实际情况:
    SELECT * FROM sys.dm_tran_locks
      

  7.   

    S
    S
    S
    S
    IX
    IX
    X
    X
    X
    X
    X
    X
    X
    图中含有这样的一列这样的数据?请问这一列锁是按照什么得出来的?谢谢