在学习innodb存储引擎的过程中,了解到一致性非锁定读是根据MVVC(行多版本控制)的方式实现的。在事务级别为REPEATABLE READ(可重复读)下,事务读取的行数据都是基于事务开始的版本。
创建一个表验证下,字段跟数据如下。
id | num |
---|---|
1 | 2 |
验证步骤如下。
步骤 | 事务a | 事务b |
---|---|---|
1 | select * from t where id = 1;(num=2) | select * from t where id = 1;(num=2) |
2 | update t set num = 3 where id = 1; | |
3 | commit; | |
4 | select * from t where id = 1;(num=2) |
假如在扣减库存中,事务a跟事务b并发查询,都发现num为1,这时候事务a已经提交了,但是因为事务的隔离性,事务b并没有发现,就会导致b扣减了库存。
在这种情况下,可以用排他锁,在查询的时候加上for update,就会查询最新的行记录版本,而不是事务开始的版本。
步骤 | 事务a | 事务b |
---|---|---|
5 | select * from t where id = 1 for update;(num=3) |
网友评论