# 事务级别 三类数据读问题 ~~~ 1.Dirty Read(脏读) 事务 A 读取了事务 B 未提交的数据,并在这个基础上又做了其他操作。 2.Unrepeatable Read(不可重复读) 事务 A 读取了事务 B 已提交的更改数据。 3.Phantom Read(幻读) 事务 A 读取了事务 B 已提交的新增数据。 ~~~ 两类数据更新问题 ~~~ 1.第一类丢失更新 2.第二类丢失更新 ~~~ ### Dirty Read(脏读) 余额应该为 1100 元才对!请看 T6 时间点,事务 A 此时查询余额为 900 元,这个数据就是脏数据,它是事务 A 造成的,明显事务没有进行隔离,渗过来了,乱套了。 所以脏读这件事情是非常要不得的,一定要解决掉!让事务之间隔离起来才是硬道理。 ![](https://box.kancloud.cn/ec577638db9d43143579d5d848e2e162_745x286.jpg) ### Unrepeatable Read(不可重复读) 事务 A 其实除了查询了两次以外,其他什么事情都没有做,结果钱就从 1000 变成 0 了,这就是重复读了 这种现象基本上是可以理解的,但在有些变态的场景下却是不允许的。 ![](https://box.kancloud.cn/d3ce9f75a5a2983cc96cfdcba3e6ea4f_746x229.jpg) ### Phantom Read(幻读) 银行工作人员,每次统计总存款,都看到不一样的结果。不过这也确实也挺正常的,总存款增多了,肯定是这个时候有人在存钱。 ![](https://box.kancloud.cn/68268667adea935e8da8998bad9fac0f_746x201.jpg) ### 第一类丢失更新 A事务撤销时,把已经提交的B事务的更新数据覆盖了。这种错误可能造成很严重的问题 ![](https://box.kancloud.cn/9a7d1963fac776bc57063443ec63002e_746x287.jpg) ### 第二类丢失更新 B事务覆盖A事务已经提交的数据,造成A事务所做操作丢失 ![](https://box.kancloud.cn/77f0bb598da5458324b3abbc684499c3_748x260.jpg) ### 事务隔离级别 从上往下,级别越来越高,并发性越来越差,安全性越来越高,反之则反 MySQL 数据库的默认事务隔离级别就是 READ\_COMMITTED ![](https://box.kancloud.cn/0614d195f28a3551d172eb4deefa3e3e_745x145.jpg)