参考文档:https://www.cnblogs.com/sushu-yaya/p/6944287.html 和马士兵老师的教程
事务并发时可能出现的问题:
第一类丢失更新(Lost Update)
时间 | 取款事务A | 存款事务B |
T1 | 开始事务 |
|
T2 |
| 开始事务 |
T3 | 查询账户余额为1000元 |
|
T4 |
| 查询账户余额为1000元 |
T5 |
| 汇入100元把余额改为1100元 |
T6 |
| 提交事务 |
T7 | 取出100元把余额改为900 元 |
|
T8 | 撤销事务 |
|
T9 | 余额恢复为1000元(丢失更新) |
|
脏读(Dirty Read):一个事务读到了另一个事务没有提交的数据
时间 | 取款事务A | 存款事务B |
T1 | 开始事务 |
|
T2 |
| 开始事务 |
T3 |
| 查询账户余额为1000元 |
T4 |
| 汇入100元把余额改为1100元 |
T5 | 查询账户余额为1100元(读取脏数据) |
|
T6 |
| 回滚 |
T7 | 取款1100 |
|
T8 | 提交事务失败 |
|
不可重复读(non-repeatableread):在同一个事务中,两次读取同一数据,得到的内容不相同
时间 | 取款事务A | 存款事务B |
T1 | 开始事务 |
|
T2 |
| 开始事务 |
T3 | 查询账户余额为1000元 |
|
T5 |
| 汇入100元把余额改为1100元 |
T5 |
| 提交事务 |
T6 | 查询帐户余额为1100元 |
|
T8 | 提交事务 |
|
不可重复读重点在修改。
发生情况:在多版本并行控制机制中
第二类丢失更新(secondlost update problem):不可重复读的特殊情况
时间 | 取款事务A | 存款事务B |
T1 |
| 开始事务 |
T2 | 开始事务 |
|
T3 |
| 查询账户余额为1000元 |
T4 | 查询账户余额为1000元 |
|
T5 |
| 取出100元把余额改为900元 |
T6 |
| 提交事务 |
T7 | 汇入100元 |
|
T8 | 提交事务 |
|
T9 | 把余额改为1100元(丢失更新) |
|
幻读(Phantom Read):同一事务中,用同样的操作读取两次,得到的记录数不相同
时间 | 查询学生事务A | 插入新学生事务B |
T1 | 开始事务 |
|
T2 |
| 开始事务 |
T3 | 查询学生为10人 |
|
T4 |
| 插入1个学生 |
T5 | 查询学生为11人 |
|
T6 |
| 提交事务 |
T7 | 提交事务 |
|
幻读的重点在新增、删除操作。
幻读发生在当两个完全相同的查询执行时,第二个查询所返回的结果集跟第一个查询不相同。
发生情况:没有范围锁
解决方案:采用范围锁RangeS RangeS_S模式,锁定检索范围为只读