mysql repeatable_MySQL的repeatable read
####在 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相关推荐
- MySQL的又一神器-锁,MySQL面试必备
原文链接:blog.ouyangsihai.cn >> MySQL的又一神器-锁,MySQL面试必备 在看这篇文章之前,我们回顾一下前面的几篇关于MySQL的文章,应该对你读下面的文章有所 ...
- MySQL 面试必备:又一神器“锁”,不会的在面试都挂了
点击上方 好好学java ,选择 星标 公众号重磅资讯.干货,第一时间送达 今日推荐:MySQL 高频面试题,都在这了个人原创+1博客:点击前往,查看更多 1 什么是锁 1.1 锁的概述 在生活中锁的 ...
- 深入理解 MySQL ——锁、事务与并发控制
本文对 MySQL 数据库中有关锁.事务及并发控制的知识及其原理做了系统化的介绍和总结,希望帮助读者能更加深刻地理解 MySQL 中的锁和事务,从而在业务系统开发过程中可以更好地优化与数据库的交互. ...
- 深入理解 MySQL—锁、事务与并发控制
本文转载自"vivo 互联网技术",已获授权. 本文对 MySQL 数据库中有关锁.事务及并发控制的知识及其原理做了系统化的介绍和总结,希望帮助读者能更加深刻地理解 MySQL 中 ...
- mysql mongodb 事务_MySQL PK MongoDB:多文档事务支持,谁更友好?
原标题:MySQL PK MongoDB:多文档事务支持,谁更友好? 作者介绍 贺春旸,凡普金科DBA团队负责人,<MySQL管理之道:性能调优.高可用与监控>第一.二版作者,曾任职于中国 ...
- mysql新增表字段回滚_MySql学习笔记四
MySql学习笔记四 5.3.数据类型 数值型 整型 小数 定点数 浮点数 字符型 较短的文本:char, varchar 较长的文本:text, blob(较长的二进制数据) 日期型 原则:所选择类 ...
- 深入理解 MySQL ——锁、事务与并发控制 1
深入理解 MySQL --锁.事务与并发控制 目录 MySQL 服务器逻辑架构 MySQL 锁 事务 隔离级别 并发控制 与 MVCC MySQL 死锁问题 1.MySQL 服务器逻辑架构 (图片来源 ...
- Mysql高级命令与概念
Mysql高级命令 1. 存储过程&函数-(了解) 在mysql数据库端编写带有逻辑的代码, 可以在客户端直接调用, java端可以写更少的代码 存储过程没有返回值, 函数必须有返回值 优点: ...
- Oracle和Mysql的区别
Oracle和Mysql的区别 一.主要区别点 1. 软件规格: Oracle是大型数据库,占用内存多: Mysql是轻量型数据库,轻量级,内存占用更小: ps: 我用docker拉了一下2者的镜像, ...
最新文章
- 干货|十大产业方向深度解析!《2020科技产业趋势报告》
- windows核心编程学习笔记(六)动态链接库
- python结束if else_python | if else || where true 流程控制
- 成功解决pywintypes.error: (2, 'LoadLibraryEx', '系统找不到指定的文件。')
- 操作系统实验报告14:Peterson 算法
- redis之闪电内幕
- 自动搭建openEuler虚拟机QEMU运行环境
- c++ tcp 封装_关于TCP三次握手和四次挥手问题,求你别再问了问了...
- ios如何看idfv_ios获取手机状态 idfa idfv 网络类型 分辨率 获取运营商
- 直方图匹配法(规则化)
- matlab%低通滤波器设计,matlab 低通滤波器设计及实现
- 【业务安全01】业务安全基础及测试流程
- wxid转扫一扫协议加好友
- python中关于__new__和__init__的个人理解
- 奇幻RPG(人物构建 与 Abstract Factory模式)
- 与老外打交道必知英文缩写400个
- 【已解】英雄联盟lol撸啊撸“寻找对局”按钮无法点击,开不了赛解决方法
- [插件使用] SwitchHosts自动更新Github Hosts文件
- Shift+鼠标右键没有:在此处打开命令窗口(W)
- jQuery和CSS制作霓虹灯文字效果