时间:2021-07-01 10:21:17 帮助过:10人阅读
结果如下:
2.在终端B开启事务B,进行同样的查询,可见结果和事务A中的结果是一样的。
- START <span style="color: #0000ff">TRANSACTION</span>;
- <span style="color: #0000ff">select</span> spt.id,spt.audit_status,spt.is_deleted <span style="color: #0000ff">from</span> stat_point_task spt limit <span style="color: #800000; font-weight: bold">5</span>;
3. 在事务A中,更新一下,将id=3的audit_status更新为3,查询一下,发现更新成功,然后提交事务A;
- <span style="color: #0000ff">update</span> stat_point_task <span style="color: #0000ff">set</span> audit_status<span style="color: #808080">=</span><span style="color: #800000; font-weight: bold">3</span>,is_deleted<span style="color: #808080">=</span><span style="color: #800000; font-weight: bold">0</span> <span style="color: #0000ff">where</span> id<span style="color: #808080">=</span><span style="color: #800000; font-weight: bold">3</span>;
- select spt.id,spt.audit_status,spt.is_deleted from stat_point_task spt limit 5<span>;<br></span>
- commit;
4. 此时,事务A更新了数据,并进行了提交,返回来再看事务B,在事务B中进行查询,发现查询到的还是事务A更新之前的数据。
- <span style="color: #008080">/*</span><span style="color: #008080">再查询下,因为可重复读,发现查询到的还是事务A更新之前的数据</span><span style="color: #008080">*/</span>
- <span style="color: #0000ff">select</span> spt.id,spt.audit_status,spt.is_deleted <span style="color: #0000ff">from</span> stat_point_task spt limit <span style="color: #800000; font-weight: bold">5</span>;
上面我们对MySQL的默认隔离级别可重复读通过进行实验进行了解释,但是,此时我有一个问题,就是事务B在进行更新的时候,是在事务A更新后的基础上更新,还是A更新前(和B通过查询得到的数据保持一致)的基础上更新,下面通过实验来分析这个问题。
5.在事务B中更新数据,假设A的更新影响到事务B,在事务A的查询结果中id=3的这条数据对应的audit_status为3,在事务B中的这条语句影响的行数应该为0,不会将audit_status设为4。
- <span style="color: #0000ff">update</span> stat_point_task <span style="color: #0000ff">set</span> audit_status<span style="color: #808080">=</span><span style="color: #800000; font-weight: bold">4</span> <span style="color: #0000ff">where</span> id<span style="color: #808080">=</span><span style="color: #800000; font-weight: bold">3</span> <span style="color: #808080">and</span> audit_status<span style="color: #808080">=</span><span style="color: #800000; font-weight: bold">1</span><span style="color: #000000">;
- </span><span style="color: #0000ff">select</span> spt.id,spt.audit_status,spt.is_deleted <span style="color: #0000ff">from</span> stat_point_task spt limit <span style="color: #800000; font-weight: bold">5</span>;
更新之后,再次进行查询,发现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.
- <span style="color: #0000ff">update</span> stat_point_task <span style="color: #0000ff">set</span> audit_status<span style="color: #808080">=</span><span style="color: #800000; font-weight: bold">5</span> <span style="color: #0000ff">where</span> id<span style="color: #808080">=</span><span style="color: #800000; font-weight: bold">3</span> <span style="color: #808080">and</span> audit_status<span style="color: #808080">=</span><span style="color: #800000; font-weight: bold">3</span><span style="color: #000000">;
- </span><span style="color: #0000ff">select</span> spt.id,spt.audit_status,spt.is_deleted <span style="color: #0000ff">from</span> stat_point_task spt limit <span style="color: #800000; font-weight: bold">5</span>;
综上,
因为MySQL的可重复读,对事务B进行查询时,事务A提交的更新不会影响到事务B。
但是对事务B进行更新时,事务A提交的更新会影响到事务B。
-------------------------------------------
如有错误,请大家多多指正,不胜感激。
-------------------------------------------
MySQL可重复读采坑记录-对事务B进行更新时,事务A提交的更新会不会影响到事务B
标签:sele set table stat idt 排查 weight 分享图片 color