mysql 可重复读_mysql 可重复读
概念
Repeatable Read(可重复读):即:事务A在读到一条数据之后,此时事务B对该数据进行了修改并提交,那么事务A再读该数据,读到的还是原来的内容。
实现原理(MVCC [ 多版本并发控制 ])
InnoDB在每行记录后面保存两个隐藏的列来,分别保存了这个行的创建时间和行的删除时间。这里存储的并不是实际的时间值,而是系统版本号,当数据被修改时,版本号加1
在读取事务开始时,系统会给当前读事务一个版本号,事务会读取版本号<=当前版本号的数据
此时如果其他写事务修改了这条数据,那么这条数据的版本号就会加1,从而比当前读事务的版本号高,读事务自然而然的就读不到更新后的数据了
现在通过实验,对问题进行下分析:
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;
我们通过下面的语句再次验证下 ‘对事务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;/*最后记得提交B事务*/
commit;
综上:
因为MySQL的可重复读,对事务B进行查询时,事务A提交的更新不会影响到事务B。
但是对事务B进行更新时,事务A提交的更新会影响到事务B。
出处:https://www.cnblogs.com/Allen-win/p/8283102.html
mysql 可重复读_mysql 可重复读相关推荐
- mysql重连_mysql自动重连
最近部署一个系统,后台用线程池来处理请求,而每个线程有一个mysql连接.当系统运行一阶段后,有些请求会出现操作"Internal error",而操作一次可能又会成功.经过多方调 ...
- mysql存储过程重命名_MySQL数据库重命名存储过程
MySQL不支持将整个数据库(db schema)重命名,我们可以通过自己写一个存储过程来实现. 实现思路: 1)创建目标数据库. 2)执行命令:rename table 原库.表 to 目标库.表, ...
- mysql连接所有字段_mysql:重命名连接的所有字段
我没有发现任何相关信息. 这是我的查询: SELECT p.*, pa.*, a.* FROM produit p LEFT OUTER JOIN produit_attribut pa ON p.i ...
- mysql不可重复读和重复读_MySql隔离级别:RU / RC / RR / S + 脏读 / 不可重复读 / 幻读 / 可重复读...
MySQL 事务 本文所说的 MySQL 事务都是指在 InnoDB 引擎下,MyISAM 引擎是不支持事务的. 数据库事务指的是一组数据操作,事务内的操作要么就是全部成功,要么就是全部失败,什么都不 ...
- 揭秘Mysql事务隔离级别之可重复读
揭秘Mysql事务隔离级别之可重复读 1.可重复读的来源 2.何为不可重复读 3.那么可重复读和不可重复读究竟有什么关系呢? 4.模拟不同事务隔离级别对不可重复的处理情况(有线程执行顺序). 4.1. ...
- mysql可重复读_到底什么是mysql的幻读和不可重复读
幻读和不可重复读的定义 事务A 按照一定条件进行数据读取, 期间事务B 插入了相同搜索条件的新数据,事务A再次按照原先条件进行读取时,发现了事务B 新插入的数据称为幻读. 如果事务A 按一定条件搜索, ...
- 视图的重命名mysql语句_sql语句重命名字段-视图重命名sql语句-数据库重命名sql语句...
sql语句如何重命名表名和列名? 一.更改数据库名 sp_renamedb 更改数据库的名称. 语法: sp_renamedb [ @dbname = ] ' old_name ' , [ @newn ...
- node.js+MySql数据库+HTML实现内部查重系统
node.js+MySql数据库+HTML实现内部查重系统 实现目标: 1.将每个人的项目登记,存入MySql数据库 2.在填写时进行实时正则判断,判断每项输入格式是否正确,方便之后进行查重对比 3. ...
- mysql 前后代表什么_MySQL的锁
1.什么是锁 锁机制用于管理对共享资源的并发访问. lock与latch latch一般称为闩锁(轻量级的锁),因为其要求锁定的时间必须非常短.若持续的时间长,则应用的性能会非常差.在InnoDB存储 ...
最新文章
- 17DOM之操作元素
- 云+X案例展 | 传播类:富通云腾加速联通云数字化转型步伐
- mac安装thrift
- Spring Boot与Spring Cloud是什么关系?
- NAACL 2018 | 最佳论文:艾伦人工智能研究所提出新型深度语境化词表征
- libRTMP 整体说明
- Python小程序(3)--BMR(基础代谢率)计算器
- 程序员工资真的很高么,月入几万的难道不是吹牛?
- 2021-10-21-Flask-04 模型关系的建立,增删改查的演示,一篇文章让你直接搞懂Flask模型
- 智能DNS解析搭建成功
- 关于勾股数的规律及证明
- (NO.00004)iOS实现打砖块游戏(一):素材的制作
- Unity开发2 3D对象的简单操作
- 构造方法调用另一个构造方法
- dlib人脸对齐(python)
- Synctoy2.1使用定时任务0X1
- MACD多周期共振指标公式,日周月共振
- 美科学家试解“姆潘巴现象”
- 爱码物联 二维码营销Saas平台_为中小微企业而生
- locust之简介(1)