数据库三级封锁协议
2019-08-06 本文已影响0人
今天不想掉头发
转自:
https://baike.baidu.com/item/%E4%B8%89%E7%BA%A7%E5%8A%A0%E9%94%81%E5%8D%8F%E8%AE%AE/1148391?fr=aladdin
https://cloud.tencent.com/developer/article/1138677
数据库分三级封锁协议:
-
一级封锁协议:事务T在修改数据A之前必须对其先加X锁,直到事务结束(COMMIT和ROLLBACK)才释放。
一级封锁协议解决丢失修改的问题。
image.png
如上图所示,倘若事务T1没有对R加X锁,则可能会被T2的修改覆盖。使用一级封锁协议后如下所示,避免了丢失T1的更新
image.png -
二级封锁协议:一级封锁协议加上事务T在读取数据R之前必须先对其加S锁,读完后可释放S锁。
二级封锁协议解决丢失修改和脏读的问题。
image.png
如下所示:
image.png -
三级封锁协议:一级封锁协议加上事务T在读取数据R之前必须先对其加S锁,直到事务结束才释放。进一步解决了不可重复读的问题(个人感觉三级封锁协议是数据库里的规定,但是对于mysql来说,可以使用MVCC来解决不可重复读中的快照读,当前读依然是要加锁的)
image.png
如下所示:
image.png