mysql的InnoDB索引存储引擎在RR(REPEATABLE READ)隔离级别下读取的情况

测试建表

create table test_transaction (

id bigint(20) NOT NULL AUTO_INCREMENT COMMENT ‘主键’,

int_f int not null default 0 comment ‘字段1’,

char_f varchar(50) not null default ” comment ‘字段2’,

time_f TIMESTAMP not null default CURRENT_TIMESTAMP comment ‘字段3’,

PRIMARY KEY (id),

unique key uqe_int (int_f),

KEY idx_char_time (char_f,time_f)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=’测试建表’;

初始准备数据

insert into test_transaction (int_f, char_f) value(520, ‘Charlotte’);

select * from test_transaction;

Part1) 起因:昨晚和光同事的一次讨论

– 获取隔离级别,确定当前是可重复度级别

SELECT @@global.tx_isolation;

– 能不能插入?插入会不会挂起,事务A能不能读取到 –

事务A

事务B

START TRANSACTION;

START TRANSACTION;

select * from test_transaction;

select * from test_transaction;

insert into test_transaction (int_f, char_f) value(521, ‘xyb’);

select * from test_transaction;

select * from test_transaction;

commit;

commit;

事务A没能读到事务B新插入的数据,事务B也没有被挂起

– 能不能删除?删除会不会挂起,事务A能不能读取到 –

事务A

事务B

START TRANSACTION;

START TRANSACTION;

select * from test_transaction;

select * from test_transaction;

delete from test_transaction where int_f=521;

select * from test_transaction;

select * from test_transaction;

commit;

commit;

事务A也还能读到事务B新删除的数据,事务B也没有被挂起

– 能不能修改?修改会不会挂起,事务A能不能读取到 –

事务A

事务B

START TRANSACTION;

START TRANSACTION;

select * from test_transaction;

select * from test_transaction;

update test_transaction set char_f=’xyb0’ where id=1;

select * from test_transaction;

select * from test_transaction;

commit;

commit;

事务A没能读到事务B的更新,事务B也没有被挂起

现象:

不管事务A查什么范围,事务B不挂起,都能插入,能修改,能删除。(乍看很震惊!有悖于S锁和X锁的理解呀!?)

Part2)

在Mysql中的InnoDB引擎,采用MVCC(Multi-Version Concurrency Control)[2],读取时候有两种来源:

- 快照读 (snapshot read),读取的是记录的可见版本 (有可能是历史版本),不用加锁,例如 select * from table where ?;

- 当前读 (current read),读取的是记录的最新版本,并且,当前读返回的记录,都会加上锁,保证其他事务不会再并发修改这条记录

- select * from table where ? lock in share mode; – 简单理解,相当于加了S锁 [3]

- select * from table where ? for update; – 简单理解,相当于加了X锁 [3]

- insert into table values (…);

- update table set ? where ?;

- delete from table where ?;

所以以前S锁和X锁的认知是在当前读所情况下,而快照读不存在任何锁。换select lock in share mode方式将刚刚的实验再来一次

– 能不能插入?插入会不会挂起,事务A能不能读取到 –

事务A

事务B

START TRANSACTION;

START TRANSACTION;

select * from test_transaction lock in share mode;

select * from test_transaction lock in share mode;

insert into test_transaction (int_f, char_f) value(521, ‘xyb’);

select * from test_transaction lock in share mode;

select * from test_transaction lock in share mode;

commit;

commit;

– 能不能删除?删除会不会挂起,事务A能不能读取到 –

事务A

事务B

START TRANSACTION;

START TRANSACTION;

select * from test_transaction lock in share mode;

select * from test_transaction lock in share mode;

delete from test_transaction where int_f=521;

select * from test_transaction lock in share mode;

select * from test_transaction lock in share mode;

commit;

commit;

– 能不能修改?修改会不会挂起,事务A能不能读取到 –

事务A

事务B

START TRANSACTION;

START TRANSACTION;

select * from test_transaction lock in share mode;

select * from test_transaction lock in share mode;

update test_transaction set char_f=’xyb0’ where id=1;

select * from test_transaction lock in share mode;

select * from test_transaction lock in share mode;

commit;

commit;

现象:

1、事务A没有commit时,事务B的查询语句能执行,但插入,修改,删除语句都会挂起

2、如果事务B先查询,然后先于事务A查询操作执行行插入,修改,删除,那么事务A读取时被挂起(和以前的S锁X锁理解一致,安心了)

mysql可重复读实验_Mysql可重复读测试相关推荐

  1. mysql 可重复读 快照_MYSQL可重复读及原理、快照读和当前读

    什么是可重复读 可重复读的实现 Repeatable Read(可重复读):一个事务在执行过程中可以看到其他事务已经提交的新插入的记录(读已经提交的,其实是读早于本事务开始且已经提交的),但是不能看到 ...

  2. mysql可重复读概念_Mysql可重复读原理

    概念 可重复读的实现 Repeatable Read(可重复读):一个事务在执行过程中可以看到其他事务已经提交的新插入的记录(读已经提交的,其实是读早于本事务开始且已经提交的),但是不能看到其他事务对 ...

  3. mysql可重复读 加锁_mysql可重复读隔离级别加锁分析

    问题 myql可重复读隔离级别下可能会导致插入阻塞,问题复现如下 表中有3列都是int类型 其索引情况如下: id为主索引,c,d为普通索引 现在开始制作问题: 在这里我分别开启两个事务:第一个事务中 ...

  4. mysql全表重命名备份_MySQL数据库重命名的快速且安全方法(3种)

    MySQL数据库重命名的方法 Innodb引擎的表如何改数据库名,MyISAM引擎又该如何操作. 如果表是MyISAM引擎可以直接去到数据库目录mv重命名文件夹就可以. Innodb完全不行,会提示相 ...

  5. mysql重设密码_MySQL之重设密码(忘记密码)讲解

    Windows下的实际操作如下: 1.关闭正在运行的MySQL. 2.打开DOS窗口,转到mysql\bin目录. 3.输入mysqld(或mysqld-nt) --skip-grant-tables ...

  6. mysql数据库编程题题_mysql数据库编程题测试

    <mysql数据库编程题测试>由会员分享,可在线阅读,更多相关<mysql数据库编程题测试(3页珍藏版)>请在人人文库网上搜索. 1.1.自行创建测试数据2.查询"生 ...

  7. mysql事务的重复性读_Mysql下InnoDB的可重复读级别的事务测试

    Mysql下InnoDB的可重复读的事务测试 ### 背景: * mysql版本:Server version: 5.1.71 * 操作系统:CentOS 6.5 X64 * 事务隔离级别:不可重复读 ...

  8. mysql不可重复读和重复读_MySql隔离级别:RU / RC / RR / S + 脏读 / 不可重复读 / 幻读 / 可重复读...

    MySQL 事务 本文所说的 MySQL 事务都是指在 InnoDB 引擎下,MyISAM 引擎是不支持事务的. 数据库事务指的是一组数据操作,事务内的操作要么就是全部成功,要么就是全部失败,什么都不 ...

  9. Mysql默认隔离级别为什么是可重复读?

    知识点总结 1.数据库默认隔离级别: mysql -可重复读: oracle,postgres -已提交读 2.mysql binlog的格式三种:statement,row,mixed 3.为什么m ...

最新文章

  1. 兼容IE8,滚动加载下一页
  2. 用文件fw读写链表_用FORTRAN95写的sgy文件读写程序
  3. MySQL中有哪些锁?
  4. 第一个QGLViewer程序
  5. Strings in the Pocket
  6. WebAssembly 系列(五)为什么 WebAssembly 更快? 1
  7. vs2015 去除 git 源代码 绑定,改成向tfs添加源码管理
  8. ubuntu的java环境变量_Ubuntu安装JDK与环境变量配置
  9. vsftpd FTP Server ‘ls.c‘ 远程拒绝服务漏洞(CVE-2011-0762)漏洞修复方案
  10. uestc oj 1218 Pick The Sticks (01背包变形)
  11. bae php微信配置,使用BAE3.0搭建微信开发环境
  12. scilab和matlab的区别,matlab 与scilab的比较.doc
  13. Python super钻石继承
  14. 体验VMware View HTML Access
  15. linux主机ip数据包抓取,tcpdump和ngrep抓不到本机数据包
  16. python linux开发_python之Linux开发环境安装
  17. libvlc获取一帧_用VLC 实现获取播放每帧视频的时间(UTC)
  18. linux配置网桥,Linux下通过brctl配置网桥
  19. 论文总结(3):Intelligent Traffic Monitoring Systems for Vehicle Classification: A Survey
  20. 100位量子计算机算力,量子算力争霸再迎赛点:谷歌称瞄准新纪录!

热门文章

  1. linux shell学习(一)第一个hello world
  2. Django模板层:DTL模板渲染-变量
  3. kuboard使用mysql_基于 Kubernetes 的微服务图形化管理界面 Kuboard
  4. TensorFlow 基础
  5. synchronized的用法介绍
  6. 武汉linux内核好找吗,Linux内核入门
  7. java quartz job_用 Quartz 进行作业调度
  8. ShadeGraph教程之节点详解4:Master Nodes
  9. linux系统可以使用ppt功能不,Linux操作系统使用5.ppt
  10. skia 源码分析_【脚下有根】之Skia库的matrix代码解读