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

之前线上出现数据重复插入的问题,通过对问题进行排查发现该问题和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。

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

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

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

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

时间: 2024-10-12 20:55:40

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

Mysql可重复读原理

mysql可重复读现象及原理分析 InnoDB---可重复读隔离级别的底层实现原理 概念 可重复读的实现 Repeatable Read(可重复读):一个事务在执行过程中可以看到其他事务已经提交的新插入的记录(读已经提交的,其实是读早于本事务开始且已经提交的),但是不能看到其他事务对已有记录的更新(即晚于本事务开始的),并且,该事务不要求与其他事务是“可串行化”的. 这句话的核心,是“但是不能看到其他事务对已有记录的更新”,那么RR隔离级别是怎么保证这一点的呢? 实现原理 使用MVCC(多版本并

oracle rac 扩展磁盘采坑记录

oracle rac 磁盘扩展采坑记录: 系统环境:VMware esxi oracle rac 11.2.0.4 昨天扩展了asm的磁盘组,FRA磁盘组和DATA磁盘组,我添加了一块硬盘320g,200g扩展到了DATA组,120g扩展到了FRA组.因为oracle使用的是raw裸设备,扩展第一个磁盘的时候,正常进行,不用关机. 坑1:但是扩展FRA组的时候,需要关机才能找得到第二个设备.重启之后扩展正常,建议扩展磁盘一次扩展到一个组. 坑二:今天我看见系统盘空间不够了,就扩展了一下系统盘空间

Android Studio采坑记录

折腾了几个月的Android Studio,终于在今天被我搞定了 ( ̄▽ ̄)~* 开贴记录下,免得下次再次采坑 先说下我之前电脑的环境配置吧,sdk是几年前在网上下载别人整理出来的包,一直没有更新过 (当然这里有各种原因,一是这里面东西太多,搞的自己云里雾里的,二是因为国内网络问题) 这里先把采坑点先写出来 1.sdk的问题(最好把常用的sdk和工具都更新一遍吧) 2.studio的代理问题(如图,开启工具s-s或s-s-r,配好代理,选择socks点击checkconntion,然后再输入ht

jumserver 3.0安装及采坑记录

参考  https://blog.51cto.com/14226596/2420441 以及官方文档 https://www.jishuchi.com/read/Jumpserver-148/2102 补充笔者采坑处理 1.安装python3环境 1>更新epel-release $yum install -y python36 python36-devel python36-pip 2>安装python后,还要修改以下两个文件内容: a)/usr/bin/yum 将第一行 #!/usr/bi

脏读 不可重复读 幻读以及第一、二类丢失更新

http://blog.csdn.net/gaoshan_820822/article/details/4582561 脏读(Dirty Read) 脏读意味着一个事务读取了另一个事务未提交的数据,而这个数据是有可能回滚. 不可重复读(Unrepeatable Read) 不可重复读意味着,在数据库访问中,一个事务范围内两个相同的查询却返回了不同数据.这是由于查询时系统中其他事务修改的提交而引起的. 例如:事务B中对某个查询执行两次,当第一次执行完时,事务A对其数据进行了修改.事务B中再次查询时

关于mysql8授权的问题,mysql萌新小白采坑记录

记录本人第一次使用mysql时踩的坑,因为我从官网下载最新的版本8.0.15msi版本的,直接下一步下一步安装完成之后,本地访问正常,然后服务器安装访问也正常.然后本地连接服务器上的mysql时报错. 百度一查,了解,原来是服务器上的mysql没有开放权限. 接下来在服务器上的命令提示符进去安装目录输入这句sql,但是一直提示语句报错,当使用 grant 权限列表 on 数据库 to '用户名'@'访问主机' identified by '密码'; 时会出现"......near 'identi

oracle11g数据库安装采坑记录

第一处坑: 解决方案: 原文:https://blog.csdn.net/yhj198927/article/details/49178279 1.打开oracle的"Net Manager" 2.打开"监听程序" 3.打开"数据库服务" 4.点击"添加数据库" 5.填写相关信息 "全局数据库名"和"SID"填写在"Database Configuration Assitant

Mybatis 采坑记录--set标签的使用

<!--根据poi_info表的id和city_id更新flag_hinterland_flows的poi_id和city_id--> <select id="selectPoiAndCityId" parameterType="java.lang.Long" resultType="com.wormpex.gs.stat.service.dao.entity.baseinfo.PoiAndCityId"> select

菜鸟关于js“this”的采坑记录

一.对象中的this 这里主要讨论函数的两种调用模式,函数模式与方法模式,以函数模式调用时,this多指undefined或window(是否使用严格模式) 定义在全局变量中的函数用函数模式调用,this指向window或undefine function example (){ console.log(this)//undefined } 定义为对象方法的函数用方法模式调用,this指定为这个对象 let xiaoming = { name:"小明", hello: function