好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

SqlServer中的事务隔离级别、锁机制

tran insert tbUnRead select 3 , ‘ 张三 ‘ union select 4 , ‘ 李四 ‘ -- -延迟秒,模拟真实交易情形,用于处理业务逻辑 waitfor delay ‘ 00:00:05 ‘ rollback tran

此时,在等待的5秒内,B某恰好对该资源做了修改:

 set   Transaction   isolation   level   read   uncommitted 

 --  查询数据 

 select   *   from  tbUnRead  where  name  like   ‘  张%  ‘ 

本来A某要插入两条数据,但是最后事务回滚了,此时数据库应该不存在这两条数据,但是B某却读取到了,这就是脏读。

要解决这个问题,就需要将事务隔离级别提升到read committed

 

2、read committed  不可重复读(避免脏读的最低级别)

假如A某正在执行如下操作:

 set   Transaction   isolation   level   read   committed 

 begin   tran 

 select   *   from  tbUnRead   where  ID =  2  

 --  -延迟秒,模拟真实交易情形,用于处理业务逻辑 

 waitfor  delay  ‘  00:00:05  ‘ 

 select   *   from  tbUnRead   where  ID =  2 

此时,在等待的5秒内,B某恰好对该资源做了修改:

 update   tbUnRead

  set  name =  ‘  Jack_upd  ‘ 

 where  ID =  2 

这样产生的结果是,在同一个事务内,两次条件相同的查询会有不同的结果。

要解决这个问题,就需要将事务隔离级别提升到repeatable read

 

3、repeatable read 幻读

假如A某在执行如下操作:

 set   Transaction   isolation   level   REPEATABLE   READ 

 begin   tran 

 select   *   from  tbUnRead   where  ID =  3  

 --  -延迟秒,模拟真实交易情形,用于处理业务逻辑 

 waitfor  delay  ‘  00:00:05  ‘ 

 select   *   from  tbUnRead   where  ID =  3  

 commit   tran 

此时,在等待的5秒内,B某恰好对该资源做了修改:

 INSERT  tbUnRead
 select   3 , ‘  幻读  ‘ 

此时,A某已经把隔离级别设置为[可重复读],虽然是曾经读取的数据,不管是共享锁还是互斥锁都 保留到了事务结束,但是无法阻止其他人运行新增操作,导致第一次查询时没有数据,第二次查询时却有了数据,这种现象被称为幻读。

要解决这个问题,就需要将事务隔离级别提升到serializable

 

SqlServer中的事务隔离级别、锁机制

标签:

查看更多关于SqlServer中的事务隔离级别、锁机制的详细内容...

  阅读:26次