并发控制中的封锁

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_35055467/article/details/72611475

并发操作带来的问题


  • 丢失修改(lost update)
  • 不可重复读(non-repeatable)
  • 读脏数据(dirty read)

丢失修改

概念:两个事务T1和T2读入同一数据并修改,T2提交的结果破坏了T1提交的结果,导致T1的修改被丢失

假设现在有一个飞机订票系统,事务T1和事务T2同时读出某一航班的剩余机票A,设A为16

这时T1和T2读出的数据都为16,因为事务T卖出了一张机票所以T1修改机票余额A = A-1然后再将A写回数据库。T2也重复同样的过程,于是就造成了卖出两张机票数据库却只少了一张机票


不可重复读

具体来说,不可重复读包括三种情况
(1)事务T1读取某一数据后,事务T2对其进行了修改,使T1无法读取前一次的结果
(2)事务T1读取某一数据后,事务T2删除了部分数据,使T1再次按相同条件读取数据时发现某些数据神秘消失了
(3)事务T1读取某一数据后,事务T2增加了部分数据,使T1再次按相同条件读取数据时发现多了一些数据


读脏数据

读脏数据是指事务修改某一数据后将其写回磁盘,事务T2读取到被修改后的数据,这时由于某种原因T1被撤销,被T1修改的数据也恢复原值,则T2就读到了不正确的数据(即数据库中不存在的数据)


基于上述原因我们需要用到并发控制技术来保证事务的隔离性和一致性。

并发控制的主要技术

  • 封锁(locking)
  • 时间戳(timestamp)
  • 乐观控制法(optimistic schedule)
  • 多版本并发控制(multi-version concurrency control,MVCC)

封锁

  • 排他锁又称为写锁(exclusive locks,X锁)
  • 共享锁又称为读锁(share locks,S锁)

排他锁

若事务T对数据对象A加上X锁,则只允许T读取和修改A,其他任何事务都不能对A加任何类型的锁,知道T释放A上的锁为止。这就保证了其他事务在T释放A上的锁之前不能读取和修改A

共享锁

若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁为止。
这就保证了其他事务可以读A,但在T释放S锁之前不能对A做任何修改

展开阅读全文

没有更多推荐了,返回首页