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的可重复读级别的事务测试相关推荐

  1. mysql 中的脏读与幻读_mysql中脏读、不可重复读、幻读以及四种隔离级别的浅显理解...

    在线QQ客服:1922638 专业的SQL Server.MySQL数据库同步软件 事务:事务由一个单元中的一个或多个SQL语句组成.在本单元中,每个MySQL语句都是相互依赖的.这个单一的单元成为不 ...

  2. mysql 解决了幻影读_MySQL到底能否解决幻读问题

    先说结论,MySQL 存储引擎 InnoDB 在可重复读(RR)隔离级别下是解决了幻读问题的. 方法:是通过next-key lock在当前读事务开启时,1.给涉及到的行加写锁(行锁)防止写操作:2. ...

  3. 如何验证 MySQL 的 InnoDB 在可重复读下依然会有幻影行问题及其原因

    如何验证 MySQL 的 InnoDB 在可重复读下依然会有幻影行问题及其原因 验证的流程 自助验证 为什么 MySQL 的 InnoDB 在可重复读下依然会有幻影行问题   很多人都知道,MySQL ...

  4. mysql数据库出现幻读_MySQL中幻读和幻读存在的问题

    1.概念 幻读指的是一个事务在前后两次查询同一个范围的时候,后一次查询看到了前一次查询没有看到的行. 可以看到,session A里执行了三次查询,分别是Q1.Q2和Q3.它们的SQL语句相同,都是s ...

  5. mysql幻读和不可重复读的区别_面试官:MySQL的可重复读级别能解决幻读吗

    Java面试笔试面经.Java技术每天学习一点 Java面试 关注不迷路 作者:宁愿. 来源:https://juejin.im/post/5c9040e95188252d92095a9e 引言 之前 ...

  6. mysql系列:加深对脏读、脏写、可重复读、幻读的理解

    关于相关术语的专业解释,请自行百度了解,本文皆本人自己结合参考书和自己的理解所做的阐述,如有不严谨之处,还请多多指教. **不可重复读的重点是修改: **同一事务,两次读取到的数据不一样. 幻读的重点 ...

  7. 不可重复读和幻读的区别_面试官:MySQL的可重复读级别能解决幻读吗

    Java面试笔试面经.Java技术每天学习一点 Java面试 关注不迷路 作者:宁愿. 来源:https://juejin.im/post/5c9040e95188252d92095a9e 引言 之前 ...

  8. MySQL可重复读级别能够解决幻读吗

    引言 之前在深入了解数据库理论的时候,了解到事物的不同隔离级别可能存在的问题.为了更好的理解所以在MySQL数据库中测试复现这些问题.关于脏读和不可重复读在相应的隔离级别下都很容易的复现了.但是对于幻 ...

  9. 事务4个隔离界别及脏读,不可重复读,幻读

    事务4个隔离界别及脏读,不可重复读,幻读 事务4个隔离级别及脏读,不可重复读,幻读 事务4个隔离级别 Read Uncommitted, Read commited, Repeatable read, ...

最新文章

  1. 用python画时序图源代码_使用python实现画AR模型时序图
  2. 华硕笔记本电池0%充不进电_笔记本电脑电池充不进电如何解决【解决方法】
  3. 不用光驱软驱与U盘,看我如何在IBM X3500 M2服务器上用PE安装Win2K3
  4. 计算最大回撤_量化扫盲:什么是最大回撤?
  5. Android存储空间不足的解决办法
  6. boost::hana::is_just用法的测试程序
  7. linux相对路径列出目录文件,linux – UNIX:列出目录中具有相对路径的文件
  8. 短信语音验证码发展的必然趋势
  9. 压缩文本、字节或者文件的压缩辅助类-GZipHelper 欢迎收藏
  10. 网络操作系统第十、十一章习题
  11. 2370. 最长理想子序列(每日一难phase2--day6)
  12. EasyRecovery2022电脑硬盘磁盘数据修复教程
  13. 高中计算机会考vb试题,高中信息技术考试vb程序题及答案
  14. HDU 4287 Intelligent IME 水题
  15. 育英oj——LZY逃命路线总数
  16. Matlab中Savitzky-Golay filtering(最小二乘平滑滤波)函数sgolayfilt的使用方法
  17. 开正式发票到底谁交税
  18. 基于android的快递寄件平台
  19. XMPP Client 流程及入门
  20. 图文详解!java开发面试简历模板java

热门文章

  1. ubantu java编辑器_Linux Ubuntu中最好的代码编辑器 程序员都这么看吗?
  2. 哈工大三本计算机考研,纯干货【普通三本逆袭哈工大】—城市规划考研必胜经验...
  3. Linux 实现网页劫持,Linux下实现劫持系统调用的总结(上)--代码及实现
  4. Ollydbg使用教程学习总结(四)
  5. 嵌套套娃,MySQL子查询,单行与多行子查询,相关和不相关(关联)子查询,完整详细可收藏
  6. win mysql 2003错误_windows MySql 报1067错误 2003错误
  7. linux常用操作符,Shell常用操作符总结
  8. java 关闭串口_java – 打开和关闭串行端口
  9. alinq mysql_ALinq让Mysql变得如此简单_MySQL
  10. php baocuo error,PHP编译报错configure: error: Cannot find libmysqlclient under /usr.