Innodb存储引擎中的一致性读与排他锁

    在学习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)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容