1.读未提交(read uncommit)
一级封锁协议(读取数据的时候不加锁,更新的时候整个加X锁)
b事物执行到一半,a事物不检测锁直接读取,结果b事物回滚了,导致a事物读出了一个错的结果,这就是脏读。
2.读已提交(read committed)
二级封锁协议(读取数据的时候加S锁,更新的时候加X锁)
a事物每次读取的时候都会尝试获取s锁,如果b事物在更新,则a阻塞等待b事物释放。
解决了脏读的问题。
因为a读取完毕以后直接释放,如果a事物有两次读取操作,而在这期间b更新了数据,
会导致两次结果不一样。这就是不可重复读
3.可重复读(repeatable read)
三级封锁协议(对读取数据的整个事务加S锁,更新的时候整个加X锁)
因为a读取操作整个加了s锁,所以在此期间b事物不能获得x锁。这样就解决了不可重复读问题。
幻读a在读表的时候,b往表里删除行,导致a统计的结果和表里现在的不一致,好像发生了幻觉。(幻读来源于表行的增加或删除,解决幻读只能对表加锁)
4.序列化(sirializable)
锁全表(事物不并发执行)
解决了幻读现象。
网友评论