####在 REPEATABLE-READ隔离级别下, session 1

mysql> SELECT @@transaction_isolation;

+-------------------------+

| @@transaction_isolation |

+-------------------------+

| REPEATABLE-READ         |

+-------------------------+

1 row in set (0.00 sec)

mysql> START TRANSACTION;

Query OK, 0 rows affected (0.00 sec)

mysql> select * from tb2;

+------+------+

| id   | c1   |

+------+------+

|   20 |    0 |

|   30 |    0 |

|   10 |    0 |

+------+------+

3 rows in set (0.00 sec)

####在 REPEATABLE-READ隔离级别下, session 2执行下列操作

mysql> START TRANSACTION;

mysql> insert into tb2 values(40,0);

mysql> commit;

或者

mysql> START TRANSACTION;

mysql> delete from tb2 where id=20;

mysql> commit;

或者

mysql> START TRANSACTION;

mysql> update tb2 set c1=111 where id=10;

mysql> commit;

####在 REPEATABLE-READ隔离级别下, session 1

mysql> select * from tb2;

+------+------+

| id   | c1   |

+------+------+

|   20 |    0 |

|   30 |    0 |

|   10 |    0 |

+------+------+

3 rows in set (0.00 sec)

在session 1的同一个transaction中,两次相同查询得到的结果一样,称之为: repeatable read

==========================================================================

但是在RR隔离级别下,locking read(SELECT with FOR UPDATE or LOCK IN SHARE MODE) 或更新,删除时是会看到已提交的修改的,包括新插入的行。

####在 REPEATABLE-READ隔离级别下, session 1

mysql> START TRANSACTION;

Query OK, 0 rows affected (0.01 sec)

mysql> select id,c1 from tb2 where id=10;

+------+------+

| id   | c1   |

+------+------+

|   10 |    0 |

+------+------+

1 row in set (0.00 sec)

mysql>

####session 2:

mysql> update tb2 set c1=101 where id =10;

####session 1:

mysql> select id,c1 from tb2 where id=10;

+------+------+

| id   | c1   |

+------+------+

|   10 |    0 |

+------+------+

1 row in set (0.00 sec)

mysql> select id,c1 from tb2 where id=10 LOCK IN SHARE MODE;

+------+------+

| id   | c1   |

+------+------+

|   10 |  101 |

+------+------+

1 row in set (0.00 sec)

mysql> update tb2 set c1=c1+1000 where id=10;

Query OK, 1 row affected (0.00 sec)

Rows matched: 1  Changed: 1  Warnings: 0

mysql> select id,c1 from tb2 where id=10;

+------+------+

| id   | c1   |

+------+------+

|   10 | 1101 |

+------+------+

1 row in set (0.00 sec)

mysql> select id,c1 from tb2 where id=10 LOCK IN SHARE MODE;

+------+------+

| id   | c1   |

+------+------+

|   10 | 1101 |

+------+------+

1 row in set (0.00 sec)

mysql>

===========================================================================

在RR的隔离级别下,默认采用Next-Key Locks(Record lock和gap lock的结合),它既锁住记录本身,也锁住索引之间的间隙,所以这个gap lock机制默认打开,并不会产生幻行

在MySQL 5.6.3之前,可以使用innodb_locks_unsafe_for_binlog参数可以禁用gap lock。

innodb_locks_unsafe_for_binlog was deprecated in MySQL 5.6.3. The READ COMMITTED isolation level provides similar functionality.

以下设置成RC隔离级别,模拟幻读

==========================================================================

####Session 1: 设置隔离级别

mysql> set global transaction isolation level read committed;

mysql> set session transaction isolation level read committed;

mysql> select @@global.transaction_isolation,@@transaction_isolation;

####Session 1: 发起一个事务,查看数据

mysql> START TRANSACTION;

Query OK, 0 rows affected (0.00 sec)

mysql> select * from t where id>2 for update;

+------+------+

| id   | name |

+------+------+

|    3 | VV   |

+------+------+

1 row in set (0.00 sec)

####Session 2: 插入一行数据

mysql> insert into t values(4,'YY');

Query OK, 1 row affected (0.01 sec)

mysql> commit;

Query OK, 0 rows affected (0.00 sec)

####Session 1: 再次查询,出现幻读

mysql> select * from t where id>2 for update;

+------+------+

| id   | name |

+------+------+

|    3 | VV   |

|    4 | YY   |

+------+------+

2 rows in set (0.00 sec)

========================================================================

gap锁的出现主要是为了避免幻读,gap锁只会阻塞insert操作, 数据库施加gap lock的条件:

1 事务隔离级别为REPEATABLE-READ,且sql走的索引为非唯一索引

或者

2 事务隔离级别为REPEATABLE-READ,且sql是一个范围的当前读操作,这时即使不是非唯一索引也会加gap lock

mysql repeatable_MySQL的repeatable read相关推荐

  1. MySQL的又一神器-锁,MySQL面试必备

    原文链接:blog.ouyangsihai.cn >> MySQL的又一神器-锁,MySQL面试必备 在看这篇文章之前,我们回顾一下前面的几篇关于MySQL的文章,应该对你读下面的文章有所 ...

  2. MySQL 面试必备:又一神器“锁”,不会的在面试都挂了

    点击上方 好好学java ,选择 星标 公众号重磅资讯.干货,第一时间送达 今日推荐:MySQL 高频面试题,都在这了个人原创+1博客:点击前往,查看更多 1 什么是锁 1.1 锁的概述 在生活中锁的 ...

  3. 深入理解 MySQL ——锁、事务与并发控制

    本文对 MySQL 数据库中有关锁.事务及并发控制的知识及其原理做了系统化的介绍和总结,希望帮助读者能更加深刻地理解 MySQL 中的锁和事务,从而在业务系统开发过程中可以更好地优化与数据库的交互. ...

  4. 深入理解 MySQL—锁、事务与并发控制

    本文转载自"vivo 互联网技术",已获授权. 本文对 MySQL 数据库中有关锁.事务及并发控制的知识及其原理做了系统化的介绍和总结,希望帮助读者能更加深刻地理解 MySQL 中 ...

  5. mysql mongodb 事务_MySQL PK MongoDB:多文档事务支持,谁更友好?

    原标题:MySQL PK MongoDB:多文档事务支持,谁更友好? 作者介绍 贺春旸,凡普金科DBA团队负责人,<MySQL管理之道:性能调优.高可用与监控>第一.二版作者,曾任职于中国 ...

  6. mysql新增表字段回滚_MySql学习笔记四

    MySql学习笔记四 5.3.数据类型 数值型 整型 小数 定点数 浮点数 字符型 较短的文本:char, varchar 较长的文本:text, blob(较长的二进制数据) 日期型 原则:所选择类 ...

  7. 深入理解 MySQL ——锁、事务与并发控制 1

    深入理解 MySQL --锁.事务与并发控制 目录 MySQL 服务器逻辑架构 MySQL 锁 事务 隔离级别 并发控制 与 MVCC MySQL 死锁问题 1.MySQL 服务器逻辑架构 (图片来源 ...

  8. Mysql高级命令与概念

    Mysql高级命令 1. 存储过程&函数-(了解) 在mysql数据库端编写带有逻辑的代码, 可以在客户端直接调用, java端可以写更少的代码 存储过程没有返回值, 函数必须有返回值 优点: ...

  9. Oracle和Mysql的区别

    Oracle和Mysql的区别 一.主要区别点 1. 软件规格: Oracle是大型数据库,占用内存多: Mysql是轻量型数据库,轻量级,内存占用更小: ps: 我用docker拉了一下2者的镜像, ...

最新文章

  1. 干货|十大产业方向深度解析!《2020科技产业趋势报告》
  2. windows核心编程学习笔记(六)动态链接库
  3. python结束if else_python | if else || where true 流程控制
  4. 成功解决pywintypes.error: (2, 'LoadLibraryEx', '系统找不到指定的文件。')
  5. 操作系统实验报告14:Peterson 算法
  6. redis之闪电内幕
  7. 自动搭建openEuler虚拟机QEMU运行环境
  8. c++ tcp 封装_关于TCP三次握手和四次挥手问题,求你别再问了问了...
  9. ios如何看idfv_ios获取手机状态 idfa   idfv   网络类型   分辨率   获取运营商
  10. 直方图匹配法(规则化)
  11. matlab%低通滤波器设计,matlab 低通滤波器设计及实现
  12. 【业务安全01】业务安全基础及测试流程
  13. wxid转扫一扫协议加好友
  14. python中关于__new__和__init__的个人理解
  15. 奇幻RPG(人物构建 与 Abstract Factory模式)
  16. 与老外打交道必知英文缩写400个
  17. 【已解】英雄联盟lol撸啊撸“寻找对局”按钮无法点击,开不了赛解决方法
  18. [插件使用] SwitchHosts自动更新Github Hosts文件
  19. Shift+鼠标右键没有:在此处打开命令窗口(W)
  20. jQuery和CSS制作霓虹灯文字效果

热门文章

  1. C语言基础专业书,C语言程序设计基础
  2. 委托开发中专利权权属诉讼时效是多久
  3. linux命令创建硬链接,Linux中的ln命令:创建软链接和硬链接
  4. 矩阵期望 matlab,matlab 矩阵元素求和、求均值(期望)和均方差
  5. git 分支代码合并
  6. ORM框架了解以及优缺点
  7. 游戏网站开发学习笔记(一)
  8. 最佳状态 (最佳状态)
  9. iOS12 UIWebView转换WKWebView
  10. 建议网站购物——建立一个简易购物网站,包括登录页面、商品选择页面和结账页面。...