【MySQL】可重复读下的幻读

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 【背景】在研究gap lock的时候,参考了一篇文章http://www.mysqlperformanceblog.com/2012/03/27/innodbs-gap-locks/按照文章的实验来进行测试并不会出现幻读。
【背景】
在研究gap lock的时候,参考了一篇文章 http://www.mysqlperformanceblog.com/2012/03/27/innodbs-gap-locks/ 按照文章的实验来进行测试并不会出现幻读。
【概念】
幻读(Phantom Read) 是指当用户读取某一范围的数据行时,B事务在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影”行。InnoDB和Falcon存储引擎通 过多版本并发控制机制解决了幻读问题。
【验证】
做一个小的测试来验证 innodb在可重复读隔离级别上面不会出现幻读。
实验版本
root@127.0.0.1 : yang 19:49:51>  select version();
+------------+
| version()  |
+------------+
| 5.5.18-log |
+------------+
1 row in set (0.00 sec)
两个会话都是 REPEATABLE-READ 事务隔离级别
root@127.0.0.1 : yang 19:56:11> select @@tx_isolation;
+-----------------+
| @@tx_isolation  |
+-----------------+
| REPEATABLE-READ |
+-----------------+
1 row in set (0.00 sec)
且在操作的是两个会话要打开事务,start transaction
session1 20:22:05> insert into gap values (11);--未提交。
Query OK, 1 row affected (0.00 sec)

--会话2 查看无id=11的记录,不允许脏读!
session2 20:22:26> select * from gap where id>9; 
+------+
| id   |
+------+
|   12 |
|   13 |
|   15 |
|   17 |
|   20 |
|   33 |
|   39 |
|   42 |
|   43 |
+------+
9 rows in set (0.00 sec)
会话1 提交
session1 20:22:21> commit;
Query OK, 0 rows affected (0.00 sec)
会话2 依然查看不到id=1的记录!
session2 20:22:32> select * from gap where id>9;
+------+
| id   |
+------+
|   12 |
|   13 |
|   15 |
|   17 |
|   20 |
|   33 |
|   39 |
|   42 |
|   43 |
+------+
9 rows in set (0.00 sec)
从本例来看 innodb 已经解决了幻读问题。对于本实验如有不妥,望各位看官不吝赐教。
【参考】

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
4月前
|
SQL Oracle 关系型数据库
详解 MySQL 的事务以及隔离级别
详解 MySQL 的事务以及隔离级别
57 0
|
6月前
|
关系型数据库 MySQL 数据库
MySQL的脏读、幻读、不可重复度是什么
**脏读**:事务读取了未提交的修改,可能导致不一致。**不可重复读**:同一事务中相同查询返回不同结果,因其他事务修改。**幻读**:事务在范围查询时,另一事务插入数据,使行数不一致。SQL-92定义四种事务隔离级别来防止这些问题:序列化、可重复读、提交读、未提交读。
|
7月前
|
SQL 关系型数据库 MySQL
【MySQL】事务?隔离级别?锁?详解MySQL并发控制机制
【MySQL】事务?隔离级别?锁?详解MySQL并发控制机制
106 0
|
8月前
|
SQL 关系型数据库 MySQL
事务隔离大揭秘:MySQL中的四种隔离级别解析
事务隔离大揭秘:MySQL中的四种隔离级别解析
1734 0
|
SQL 关系型数据库 MySQL
MySQL 中事务以及事务隔离级别的详解
MySQL 中事务以及事务隔离级别的详解
76 0
|
8月前
|
Oracle 关系型数据库 MySQL
MySQL事务的隔离级别
MySQL事务的隔离级别
73 1
MySQL事务的隔离级别
|
8月前
|
SQL 缓存 关系型数据库
MySQL事务详解与隔离级别的实现
四个特性 原子性:所有操作要么全部执行要么全部不执行,一条指令失败则数据进行回滚,回到所有指令执行前的状态。 一致性:事务开始前和结束后,数据库的完整性约束没有被破坏。即数据从一个状态转换为另一个状态,但是对于整个数据的完整性保持稳定。比如A向B转账,不可能A扣了钱,B却没收到。 隔离性:同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转账。 持久性:事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。
|
存储 关系型数据库 MySQL
【MySQL】 MySQL索引事务
【MySQL】 MySQL索引事务
|
缓存 关系型数据库 MySQL
Mysql事务&隔离级别解读和分析
Mysql事务&隔离级别解读和分析
|
SQL 关系型数据库 MySQL
你知道MySQL是如何解决幻读的吗?
你知道MySQL是如何解决幻读的吗?
413 0
你知道MySQL是如何解决幻读的吗?