数据库|事务隔离

一、事务的并发问题

  • 脏读
  • 不可重复读
  • 幻象读
  • 第一类丢失更新
  • 第二类丢失更新
1、脏读(diety read)

①定义:A事务读取B事务尚未提交的更改数据,并在这个数据的基础上操作。如果恰巧B事务回滚,那么A事务读到的数据根本是不被承认的。
② 举个例子
在这里插入图片描述
在这个场景中,B希望取款500元但又撤销,而A往账户中转入100元,就因为A事务读取B事务尚未提交的数据,账户白白丢失了500元。

2、不可重复读(unrepeatable read)

①定义:A事务读取了B事务已经提交的更改数据
②举个例子
在这里插入图片描述
在事务A中,T4和T7时间点读取账户余额不一样。

3、幻读(phantom read)

①定义:A事务读取B事务提交的新增数据。(注意区分不可重复读,这里的数据是更改后的数据,比如更改/删除处理后的数据)
②举个例子
在一个事务中,两次统计存款账户的总金额,但是在两次统计的过程中,新增了一个账户,并且存入100元,就会导致两次统计的总金额不一样。
在这里插入图片描述
如果新增的数据刚好满足事务的查询条件(例如查询总金额),这个新数据就会进入事务的视野,因为产生了统计不一样的状况。

4、第一类丢失更新

①定义:A事务撤销时,把已经提交的B事务的更新数据覆盖了。
②举个例子
在这里插入图片描述
A事务在撤销时,将B事务已经转入账户的金额给抹去了。

5.第二类丢失更新

①定义:A事务覆盖B事务已经提交的数据
②举个例子
在这里插入图片描述
事务A覆盖了事务B对存款余额所做的更新,导致银行最后损失了100元。
相反的,如果事务A先提交,那么用户账户将损失100元。

总结

不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表。

二、事务隔离级别

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Geekst/article/details/90545509