[数据库]数据库三级加锁协议深入理解

在并发事务的执行时,容易引起数据不一致,有一下几种情况
  • 丢失修改
    :两个事务T1和T2读入同一数据并修改,T2提交的结果破坏了T1提交的结果,导致T1的修改被丢失
  • 读脏数据
    :事务T1对数据D进行修改,事务T2读取到了事务T1修改的数据,接着事务T1发生异常进行回滚,事务T2读取到的就叫做“脏数据"
  • 不可重复读
    :不可重复读是指事务T1读取数据后,事务T2执行更新操作,使T1无法再现前一次读取结果

数据库的三段加锁协议,可以很好的解决以上问题

三段锁协议:

  • 共享锁(S锁):共享 (S) 用于不更改或不更新数据的操作(只读操作),如 SELECT 语句。

如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能加排他锁。获准共享锁的事务只能读数据,不能修改数据。

  • 排他锁(X锁):用于数据修改操作,例如 INSERT、UPDATE 或 DELETE。确保不会同时同一资源进行多重更新。

如果事务T对数据A加上排他锁后,则其他事务不能再对A加任任何类型的封锁。获准排他锁的事务既能读数据,又能修改数据。

用三段锁协议来解决数据不一致的三种情况

  • 1.一级封锁协议解决丢失修改
    当事务在更新数据的时候给数据加上排他锁
    原理:加上排他锁之后,其他事务不能对该数据加上任意锁,在当前事务没有释放锁时其他事务不能进行对该数据的读写操作,只有当前事务释放排他锁之后,才能对该数据进行操作

  • 2.二级封锁协议解决读脏数据
    在一级封锁协议的基础上,当事务在读取数据的时候加共享锁,读取完成后释放锁
    原理:加入共享锁之后,不能对该数据加排他锁,即其他事务不能进行修改数据。所以此时读取的数据一定是与数据库一致的

  • 3.三级封锁线协议不可重复读
    在一级封锁协议的基础上,当事务在读取数据的时候加共享锁,事务结束后释放
    原理:加入共享锁之后,不能对该数据加排他锁,即其他事务不能进行修改数据。如果读取完成后就释放,那么其他事务此时可以修改该数据。当延迟到事务结束后释放,其他事务就无法修改该数据了

事务的封锁级别不是越高就越好,随着封锁粒度的增加会影响执行效率。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章