mysql事务的重复性读_Mysql下InnoDB的可重复读级别的事务测试
Mysql下InnoDB的可重复读的事务测试
### 背景:
* mysql版本:Server version: 5.1.71
* 操作系统:CentOS 6.5 X64
* 事务隔离级别:不可重复读
### 实验前的准备:
mysql> use test;
mysql> create table test_table(id int primary key, name varchar(255)) ENGINE=InnoDB;
mysql> insert into test_table value(1, 'lily');
mysql> create table test_table2(id int primary key, name varchar(255)) ENGINE=InnoDB;
mysql> insert into test_table2 value(1, 'lucy');
### 实验1
问题:事务从什么时候开始?
测试两边同事开启事务,只在终端A中进行update操作,提交完成之后,在终端B中观察
步骤 终端A 终端B
1 mysql> set autocommit = off; mysql> set autocommit = off;
2 mysql> update test_table set name = 'lucy';
3 mysql> commit;
4 mysql> select * from test_table;
+----+--------+
| id | name |
+----+--------+
| 1 | lucy |
+----+--------+
1 rows in set (0.00 sec)
在终端B中直接可以看到终端A所做的修改,说明事务并不是从命令"set autocommit = off"执行时就开始;
还原影响数据:
mysql> update test_table set name = 'lily';
mysql> commit;
只在终端A中进行更新操作,同时在终端B中对库中的任意一个表进行一个操作,终端A提交之后,观察终端B中的数据;然后在终端B中执行commit之后,再次查看终端A中修改的数据。
步骤 终端A 终端B
1 mysql> rollback; mysql> rollback;
2 mysql> update test_table set name = 'lucy'; mysql> select * from test_table2;
3 mysql> commit;
4 mysql> select * from test_table;
+----+--------+
| id | name |
+----+--------+
| 1 | lily |
+----+--------+
1 row in set (0.00 sec)
mysql> commit;
mysql> select * from test_table;
+----+--------+
| id | name |
+----+--------+
| 1 | lucy |
+----+--------+
1 row in set (0.00 sec)
这里启动了事务,说明事务是以第一条SQL时开始的
### 实验2
问题:InnoDB在不可重复读隔离级别下,有没有幻读情况
还原影响数据:
mysql> update test_table set name = 'lily';
mysql> commit;
步骤 终端A 终端B
1 mysql> rollback; mysql> rollback;
2 mysql> insert into test_table value(2, 'lucy'); mysql> select * from test_table2;
3 mysql> commit;
4 mysql> select * from test_table;
+----+--------+
| id | name |
+----+--------+
| 1 | lily |
+----+--------+
1 row in set (0.00 sec)
mysql> rollback;
mysql> select * from test_table;
+----+--------+
| id | name |
+----+--------+
| 1 | lily |
| 2 | lucy |
+----+--------+
2 rows in set (0.00 sec)
这里没有存在幻读的情况,说明InnoDB对幻读有处理。
### 实验3
问题:同事开启两个事务A和B,事务A中插入一条记录R,事务B中插入另一条记录R2,R2的主键与记录R相同,如何处理?
还原影响数据:
mysql> delete from test_table where id = 2;
mysql> commit;
步骤 终端A 终端B
1 mysql> rollback; mysql> rollback;
2 mysql> insert into test_table value(2, 'lucy'); mysql> select * from test_table2;
3 mysql> commit;
4 mysql> insert into test_table value(2, 'lucy');
ERROR 1062 (23000): Duplicate entry '2' for key 'PRIMARY'
这种情况下,会报错。
### 实验4
问题:不同事务更新同一条记录。
步骤 终端A 终端B
1 mysql> rollback; mysql> rollback;
2 mysql> update test_table set name = 'lily2' where id = 1;
3 mysql> update test_table set name = 'lily3' where id = 1;
... 卡住 ... 在超过一定时间之后报错:
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
两个事务在编辑同一条数据时,先编辑的事务会将该记录锁定,或编辑的事务会等待一定时间,如果一定直接内仍然被锁定则报错。
mysql事务的重复性读_Mysql下InnoDB的可重复读级别的事务测试相关推荐
- mysql 中的脏读与幻读_mysql中脏读、不可重复读、幻读以及四种隔离级别的浅显理解...
在线QQ客服:1922638 专业的SQL Server.MySQL数据库同步软件 事务:事务由一个单元中的一个或多个SQL语句组成.在本单元中,每个MySQL语句都是相互依赖的.这个单一的单元成为不 ...
- mysql 解决了幻影读_MySQL到底能否解决幻读问题
先说结论,MySQL 存储引擎 InnoDB 在可重复读(RR)隔离级别下是解决了幻读问题的. 方法:是通过next-key lock在当前读事务开启时,1.给涉及到的行加写锁(行锁)防止写操作:2. ...
- 如何验证 MySQL 的 InnoDB 在可重复读下依然会有幻影行问题及其原因
如何验证 MySQL 的 InnoDB 在可重复读下依然会有幻影行问题及其原因 验证的流程 自助验证 为什么 MySQL 的 InnoDB 在可重复读下依然会有幻影行问题 很多人都知道,MySQL ...
- mysql数据库出现幻读_MySQL中幻读和幻读存在的问题
1.概念 幻读指的是一个事务在前后两次查询同一个范围的时候,后一次查询看到了前一次查询没有看到的行. 可以看到,session A里执行了三次查询,分别是Q1.Q2和Q3.它们的SQL语句相同,都是s ...
- mysql幻读和不可重复读的区别_面试官:MySQL的可重复读级别能解决幻读吗
Java面试笔试面经.Java技术每天学习一点 Java面试 关注不迷路 作者:宁愿. 来源:https://juejin.im/post/5c9040e95188252d92095a9e 引言 之前 ...
- mysql系列:加深对脏读、脏写、可重复读、幻读的理解
关于相关术语的专业解释,请自行百度了解,本文皆本人自己结合参考书和自己的理解所做的阐述,如有不严谨之处,还请多多指教. **不可重复读的重点是修改: **同一事务,两次读取到的数据不一样. 幻读的重点 ...
- 不可重复读和幻读的区别_面试官:MySQL的可重复读级别能解决幻读吗
Java面试笔试面经.Java技术每天学习一点 Java面试 关注不迷路 作者:宁愿. 来源:https://juejin.im/post/5c9040e95188252d92095a9e 引言 之前 ...
- MySQL可重复读级别能够解决幻读吗
引言 之前在深入了解数据库理论的时候,了解到事物的不同隔离级别可能存在的问题.为了更好的理解所以在MySQL数据库中测试复现这些问题.关于脏读和不可重复读在相应的隔离级别下都很容易的复现了.但是对于幻 ...
- 事务4个隔离界别及脏读,不可重复读,幻读
事务4个隔离界别及脏读,不可重复读,幻读 事务4个隔离级别及脏读,不可重复读,幻读 事务4个隔离级别 Read Uncommitted, Read commited, Repeatable read, ...
最新文章
- 用python画时序图源代码_使用python实现画AR模型时序图
- 华硕笔记本电池0%充不进电_笔记本电脑电池充不进电如何解决【解决方法】
- 不用光驱软驱与U盘,看我如何在IBM X3500 M2服务器上用PE安装Win2K3
- 计算最大回撤_量化扫盲:什么是最大回撤?
- Android存储空间不足的解决办法
- boost::hana::is_just用法的测试程序
- linux相对路径列出目录文件,linux – UNIX:列出目录中具有相对路径的文件
- 短信语音验证码发展的必然趋势
- 压缩文本、字节或者文件的压缩辅助类-GZipHelper 欢迎收藏
- 网络操作系统第十、十一章习题
- 2370. 最长理想子序列(每日一难phase2--day6)
- EasyRecovery2022电脑硬盘磁盘数据修复教程
- 高中计算机会考vb试题,高中信息技术考试vb程序题及答案
- HDU 4287 	Intelligent IME 水题
- 育英oj——LZY逃命路线总数
- Matlab中Savitzky-Golay filtering(最小二乘平滑滤波)函数sgolayfilt的使用方法
- 开正式发票到底谁交税
- 基于android的快递寄件平台
- XMPP Client 流程及入门
- 图文详解!java开发面试简历模板java
热门文章
- ubantu java编辑器_Linux Ubuntu中最好的代码编辑器 程序员都这么看吗?
- 哈工大三本计算机考研,纯干货【普通三本逆袭哈工大】—城市规划考研必胜经验...
- Linux 实现网页劫持,Linux下实现劫持系统调用的总结(上)--代码及实现
- Ollydbg使用教程学习总结(四)
- 嵌套套娃,MySQL子查询,单行与多行子查询,相关和不相关(关联)子查询,完整详细可收藏
- win mysql 2003错误_windows MySql 报1067错误 2003错误
- linux常用操作符,Shell常用操作符总结
- java 关闭串口_java – 打开和关闭串行端口
- alinq mysql_ALinq让Mysql变得如此简单_MySQL
- php baocuo error,PHP编译报错configure: error: Cannot find libmysqlclient under /usr.