Mysql 并发事务带来的问题

并发事务带来的问题

针对 mysql InnoDB

编号 问题 描述
1 脏读
2 不可重复读
3 幻读
4 丢失更新 两个事务同时修改1 条记录,事务 A 的修改覆盖事务 B 的修改。

丢失更新

事务 A 事务 B
begin;
int b = select money from t where id = 0;//b 开始是 1
b = b+1;
update t set money = b where id =0;
begin;
int b = select money from t where id = 0;//这里读到是 1
b = b+2;
commit;//b=2
update t set money = b where id =0;
commit;//覆盖 A 事务的 2,变成了 3

InnoDB默认的隔离级别 可重复读 RR + next-key Lock 解决了上面的 1~3 的问题,那丢失更新的解决方法如下:

  1. 通过悲观锁,通过 select xxx for update 加 X 锁
  2. 通过乐观锁(CAS), 记录加多一个版本号,查询时记录下来,更新的时候做比较,不等于是重复执行
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容