1.脏读
A事务读取到B事务尚未提交的更改数据,并在这个数据的基础上进行操作。如果恰巧B事务回滚,那么A事务读到的数据根本是不被承认的。
时间 | 转账事务A | 转账事务B |
---|---|---|
T1 | 开始事务 | |
T2 | 开始事务 | |
T3 | 查询账户余额为1000 | |
T4 | 取出500,余额改为500 | |
T5 | 查询账户余额为500 | |
T6 | 撤销事务,余额恢复1000 | |
T7 | 汇入100,把余额改为600 | |
T8 | 提交事务 |
2.不可重复读
不可重复读是指A事务读取了B事务已经提交的更改数据。假设A在取款事务过程中,B往账户转了100元,A两次读取账户的余额发生不一致。
时间 | 取款事务A | 转账事务B |
---|---|---|
T1 | 开始事务 | |
T2 | 开始事务 | |
T3 | 查询账户余额为1000 | |
T4 | 查询账户余额为1000 | |
T5 | 取出100,把余额改为900 | |
T6 | 提交事务 | |
T7 | 查询账户余额为900(和T4查询的不一致) |
3.幻想读
A事务读取到B事务提交的新增数据,这时A事务将出现幻想读的问题。幻想读一般发生在计算统计数据的事务中。
时间 | 统计金额事务A | 转账事务B |
---|---|---|
T1 | 开始事务 | |
T2 | 开始事务 | |
T3 | 统计总存款数为1000 | |
T4 | 新增一个存款账户,存入100 | |
T5 | 提交事务 | |
T6 | 统计总存款数为1100 |
4.第一类丢失更新
A事务撤销时,把已经提交的B事务的更新数据覆盖了。
时间 | 取款事务A | 转账事务B |
---|---|---|
T1 | 开始事务 | |
T2 | 开始事务 | |
T3 | 查询账户余额为1000 | |
T4 | 查询账户余额为1000 | |
T5 | 汇入100,把余额改为1100 | |
T6 | 提交事务 | |
T7 | 取出100,把余额改为900 | |
T8 | 撤销事务 | |
T9 | 余额恢复为1000 |
5.第二类丢失更新
A事务覆盖B事务已经提交的数据,造成B事务所做的操作丢失。
时间 | 转账事务A | 取款事务B |
---|---|---|
T1 | 开始事务 | |
T2 | 开始事务 | |
T3 | 查询账户余额为1000 | |
T4 | 查询账户余额为1000 | |
T5 | 取出100,把余额改为900 | |
T6 | 提交事务 | |
T7 | 汇入100 | |
T8 | 提交事务 | |
T9 | 把余额改为1100 |