在并发事务的执行时,容易引起数据不一致,有一下几种情况
丢失修改
:两个事务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.三级封锁线协议不可重复读
在一级封锁协议的基础上,当事务在读取数据的时候加共享锁,事务结束后释放
原理:加入共享锁之后,不能对该数据加排他锁,即其他事务不能进行修改数据。如果读取完成后就释放,那么其他事务此时可以修改该数据。当延迟到事务结束后释放,其他事务就无法修改该数据了
事务的封锁级别不是越高就越好,随着封锁粒度的增加会影响执行效率。
————————————————
版权声明:本文为CSDN博主「豪满天下」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43752167/article/details/100741144