首页 > 数据库技术 > 详细

MySQL可重复读采坑记录-对事务B进行更新时,事务A提交的更新会不会影响到事务B

时间:2018-01-14 13:43:29      阅读:116      评论:0      收藏:0      [点我收藏+]

标签:但是   start   clas   行数   通过   基础上   transacti   隔离   delete   

之前线上出现数据重复插入的问题,通过对问题进行排查发现该问题和MySQL的默认隔离级别-Repeatable Read(可重读)有关系,可重复读确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。现在通过实验,对问题进行下分析。

 

1.在终端A开启事务A,查询一下。

START TRANSACTION;
select spt.id,spt.audit_status,spt.is_deleted  from stat_point_task spt limit 5;

结果如下:

 技术分享图片

 

2.在终端B开启事务B,进行同样的查询,可见结果和事务A中的结果是一样的。

START TRANSACTION;
select spt.id,spt.audit_status,spt.is_deleted from stat_point_task spt limit 5;

技术分享图片

3. 在事务A中,更新一下,将id=3的audit_status更新为3,查询一下,发现更新成功,然后提交事务A;

update stat_point_task set audit_status=3,is_deleted=0 where id=3;
select spt.id,spt.audit_status,spt.is_deleted  from stat_point_task spt limit 5;
commit;

技术分享图片

4. 此时,事务A更新了数据,并进行了提交,返回来再看事务B,在事务B中进行查询,发现查询到的还是事务A更新之前的数据。

/*再查询下,因为可重复读,发现查询到的还是事务A更新之前的数据*/
select spt.id,spt.audit_status,spt.is_deleted from stat_point_task spt limit 5;

技术分享图片

 

上面我们对MySQL的默认隔离级别可重复读通过进行实验进行了解释,但是,此时我有一个问题,就是事务B在进行更新的时候,是在事务A更新后的基础上更新,还是A更新前(和B通过查询得到的数据保持一致)的基础上更新,下面通过实验来分析这个问题。

5.在事务B中更新数据,假设A的更新影响到事务B,在事务A的查询结果中id=3的这条数据对应的audit_status为3,在事务B中的这条语句影响的行数应该为0,不会将audit_status设为4。

update stat_point_task set audit_status=4 where id=3 and audit_status=1;
select spt.id,spt.audit_status,spt.is_deleted from stat_point_task spt limit 5;

更新之后,再次进行查询,发现id=3的这条数据对应的audit_status依然为1,说明事务A的更新影响到了事务B。

技术分享图片

 

我们通过下面的语句再次验证下 ‘对事务B进行更新时,事务A提交的更新影响到了事务B’ ,此时事务A中提交的更新已经将id=3的audit_status更新为3,虽然因为可重复读,事务B中查询到的id=3的audit_status为1,但是在事务B中进行如下的更新的时候,却更新成功了,成功将audit_status更新为5.

 

update stat_point_task set audit_status=5 where id=3 and audit_status=3;
select spt.id,spt.audit_status,spt.is_deleted from stat_point_task spt limit 5;

 

技术分享图片

 

综上,

因为MySQL的可重复读,对事务B进行查询时,事务A提交的更新不会影响到事务B。

但是对事务B进行更新时,事务A提交的更新会影响到事务B。

 

-------------------------------------------

如有错误,请大家多多指正,不胜感激。

-------------------------------------------

MySQL可重复读采坑记录-对事务B进行更新时,事务A提交的更新会不会影响到事务B

标签:但是   start   clas   行数   通过   基础上   transacti   隔离   delete   

原文:https://www.cnblogs.com/Allen-win/p/8283102.html

(0)
(0)
   
举报
评论 一句话评论(0
0条  
登录后才能评论!
© 2014 bubuko.com 版权所有 鲁ICP备09046678号-4
打开技术之扣,分享程序人生!
             

鲁公网安备 37021202000002号