第一类丢失更新
时刻 | 事务1 | 事务2 | 备注 |
---|---|---|---|
T0 | 开始事务 | 开始事务 | 初始化账户余额为1000 |
T1 | 扣减100余额 | 此时事务1中余额为900 | |
T2 | 扣减100余额 | 此时事务2中余额为900 | |
T3 | 提交事务 | 账户余额更新为900 | |
T4 | 回滚事务 | 又把账户余额回滚成了1000 |
以上一个事务回滚,另一个事务提交引起的数据不一致问题的情况,就称为第一类丢失更新。
第二类丢失更新
时刻 | 事务1 | 事务2 | 备注 |
---|---|---|---|
T0 | 开始事务 | 开始事务 | 初始化账户余额为1000 |
T1 | 读取余额为1000 | ||
T2 | 读取余额为1000 | ||
T3 | 扣减100余额 | ||
T3 | 提交事务 | 更新账户余额为900 | |
T4 | 添加余额100 | 这时候没有去再做第二次查询,所以事务2中的余额还是1000,那么余额就变为1100,但是其实最终结果应该是1000 | |
T5 | 提交事务 | 更新账户余额为1100 |
以上一个事务提交,另一个事务也提交引起的丢失更新问题的情况,就称为第二类丢失更新。
Ps:因为加入了事务隔离级别,而标准定义的所有隔离界别都不允许第一类丢失更新发生,所以第一类丢失更新的问题在现代数据库中已经不会出现了。