Consistent Nonlocking Reads,Locking Reads 和Phantom Rows

本文涉及的产品
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: 初衷是想用简单说下innodb的Transaction Isolation Levels和InnoDB Locking之间的关系,因为只写的话不容易理解,后来想以Consistent Nonlocking Reads,Locking Reads为突破点,用简单的例子来说明mysql常用的事务隔离级别.

实为吾之愚见,望诸君酌之!闻过则喜,与君共勉 

初衷是想用简单说下innodb的Transaction Isolation Levels和InnoDB Locking之间的关系,因为只写的话不容易理解,后来想以Consistent Nonlocking Reads,Locking Reads为突破点,用简单的例子来说明mysql常用的事务隔离级别(READ COMMITTED, REPEATABLE READ)和lock(record lock,gap lock,next-key lock, Insert Intention Lock)的关系,所以看起来更像是围绕mysql的三种select的测试,下面的测试多基于自建mysql进行

第一节   测试数据

create table MOCK_DATA (

         id INT auto_increment,

         first_name VARCHAR(50),

         last_name VARCHAR(50),

         email VARCHAR(50),

         ram_num INT,

         ip_address VARCHAR(20),

         primary key(id)

);

insert into MOCK_DATA (id, first_name, last_name, email, ram_num, ip_address) values (1, 'Emelen', 'Jayme', 'ejayme0@adobe.com', 16, '212.117.129.58');

insert into MOCK_DATA (id, first_name, last_name, email, ram_num, ip_address) values (2, 'Gaston', 'Rosenwald', 'grosenwald1@woothemes.com', 1, '177.160.142.3');

insert into MOCK_DATA (id, first_name, last_name, email, ram_num, ip_address) values (3, 'Onida', 'Beckey', 'obeckey2@bluehost.com', 100, '246.91.205.135');

insert into MOCK_DATA (id, first_name, last_name, email, ram_num, ip_address) values (4, 'Pen', 'Schwant', 'pschwant3@wikimedia.org', 70, '173.23.34.192');

insert into MOCK_DATA (id, first_name, last_name, email, ram_num, ip_address) values (5, 'Amelina', 'Yousef', 'ayousef4@zimbio.com', 36, '236.121.250.36');

insert into MOCK_DATA (id, first_name, last_name, email, ram_num, ip_address) values (6, 'Sallie', 'Gentner', 'sgentner5@bluehost.com', 21, '195.38.73.120');

insert into MOCK_DATA (id, first_name, last_name, email, ram_num, ip_address) values (7, 'Julienne', 'Dobrovolski', 'jdobrovolski6@hostgator.com', 74, '123.70.179.160');

insert into MOCK_DATA (id, first_name, last_name, email, ram_num, ip_address) values (8, 'Idelle', 'O''Shiel', 'ioshiel7@naver.com', 62, '16.85.248.74');

insert into MOCK_DATA (id, first_name, last_name, email, ram_num, ip_address) values (9, 'Earle', 'Giacomazzo', 'egiacomazzo8@hibu.com', 49, '108.191.110.142');

insert into MOCK_DATA (id, first_name, last_name, email, ram_num, ip_address) values (10, 'Celestyn', 'Wyrill', 'cwyrill9@prnewswire.com', 4, '82.232.65.146');

insert into MOCK_DATA (id, first_name, last_name, email, ram_num, ip_address) values (11, 'Bryanty', 'Broadbridge', 'bbroadbridgea@nih.gov', 7, '117.70.48.113');

insert into MOCK_DATA (id, first_name, last_name, email, ram_num, ip_address) values (12, 'Tybi', 'Pegden', 'tpegdenb@home.pl', 96, '138.137.28.35');

insert into MOCK_DATA (id, first_name, last_name, email, ram_num, ip_address) values (13, 'Wash', 'Leed', 'wleedc@cnn.com', 64, '21.106.123.29');

insert into MOCK_DATA (id, first_name, last_name, email, ram_num, ip_address) values (14, 'Rog', 'Muncer', 'rmuncerd@blogger.com', 49, '161.38.63.134');

insert into MOCK_DATA (id, first_name, last_name, email, ram_num, ip_address) values (15, 'Alec', 'Borleace', 'aborleacee@ustream.tv', 71, '152.192.32.148');

insert into MOCK_DATA (id, first_name, last_name, email, ram_num, ip_address) values (16, 'Roberto', 'Seer', 'rseerf@ocn.ne.jp', 94, '238.104.254.189');

insert into MOCK_DATA (id, first_name, last_name, email, ram_num, ip_address) values (17, 'Brittani', 'Ivers', 'biversg@hubpages.com', 62, '219.48.22.242');

insert into MOCK_DATA (id, first_name, last_name, email, ram_num, ip_address) values (18, 'Jenna', 'Weekly', 'jweeklyh@google.co.uk', 33, '0.94.96.82');

insert into MOCK_DATA (id, first_name, last_name, email, ram_num, ip_address) values (19, 'Rog', 'Wabersich', 'rwabersichi@house.gov', 53, '151.65.81.105');

insert into MOCK_DATA (id, first_name, last_name, email, ram_num, ip_address) values (20, 'Elihu', 'Trowsdall', 'etrowsdallj@123-reg.co.uk', 72, '181.39.19.158');

第二节 现象对比

Session1:

开启session1,执行一次select:

68bba3a3de163299ebf37f9320b6a8c592da2172

Session2:

开启session2,插入一条数据

9cbdccdac5624793dbb9423520617d536db63ae4

Session 3:

再次执行select,同时再执行select…lock in share mode和select…for update

721a96045d9039c9ea03b6481d09e9870addece7

第三节 Consistent Nonlocking Reads:Select

3.1  加锁测试

3.1.1 REPEATABLE READ

Session1

 a5e549e4b366622700c7fef704fe37573c590372

Session2执行show engine innodb status\G:

ac9a4281e3538582ce1fdb79901492e0f3018fda

如上可见,在REPEATABLE READ的隔离级别下mysql执行select这类操作的时候,是不加锁的,并且会生成一个read view来判断可见性

3.1.2 READ COMMITTED

Session1:

 236784955e220b87e165bbe7933fba756d8c97cc

Session2执行show engine innodb status\G:

c0c1db071df0e32dadd925915255ca64e973ae54

如上可见,在READ COMMITTED的隔离级别下mysql执行select这类操作的时候,是不加锁的,不会生成一个read view来判断可见性

3.2 REPEATABLE READ测试

3.2.1 REPEATABLE READ

Session1:

e2663a17e46a0bf378e33e34da80d08ce0184b94

Session2:

f603259022ec993d287ec908f57abbcebefa028e

Session1:

6abd0ca5fa83d03f8e3e8dccece82721864c5b1e

如上可见,在REPEATABLE READ的隔离级别下,可以实现REPEATABLE READ

3.2.2 READ COMMITTED

Session1:

3a98c1fe1e30aac45a1a6c7a01096b1a13014bae

Session2:

24926301eb10bf7974a958c8279e09f1ff256c87

Session1:

6c5ed45e8f7d9e8932ed1deec78c4913ec652a08

如上可见,在READ COMMITTED的隔离级别下,不能保证REPEATABLE READ

 

3.3 Phantom Rows测试

3.3.1 REPEATABLE READ

Session1:

2c9cb2eb2f0d74de08ccc3fca91933c660d9bd07

Session2:

3965840133e43deaf385bcc5f6e29b55e31757cd

Session1:

8031bfbfc60ec876efaf4a55d238f93c693db1e6

如上可见,在REPEATABLE READ的隔离级别下,可以避免出现简单的Phantom Rows

例外如下:

d1cef29fbc4b7bcc262eeedbd1742180fe068923

3.3.2 READ COMMITTED

Session1:

b87d589fc9a844fc304f78a8945479908e82345b

Session2:

cca5fbcdea0ec873335a7a22fdac37fa7fc0aae4

Session1:

8ac9f11c1fd0513e089c00b6dd1a761053123273

如上可见,在READ COMMITTED的隔离级别下无法避免Phantom Rows

第四节 Locking Reads :SELECT ... LOCK IN SHARE MODE/FOR UPDATA

此处以测试lock in share mode为例

4.1加锁测试

4.1.1 REPEATABLE READ

Session1:

 f4466d7998add264834414d0a9905a52e7dec729

Session2执行show engine innodb status\G:

900841475ebef42e271feecbb9c4469a437a66f9

如上可见,在REPEATABLE READ的隔离级别下mysql执行select…lock in share mode这类操作的时候,是加锁的,没有read view

4.1.2 READ COMMITTED

Session1:

 ca1270c5880f9f19e453cb251893f96d9da1cd0b

Session2执行show engine innodb status\G:

7cb3cf010993c34b46ae107c687f399b0cce4229

如上可见,在READ COMMITTED的隔离级别下mysql执行select…lock in share mode这类操作的时候,是加锁的,不会生成一个read view来判断可见性

 

4.2 REPEATABLE READ测试

4.2.1 REPEATABLE READ

Session1:

b63057b4773a4b2d28224447edc5c93591c5b650

Session2:

aa7a8da6b3841b15600863a8df4d01bdc40cc570

Session3执行show engine innodb status\G:

1b561fc3fd03b8fca4603ff419ad83a842a64438

如上可见,在REPEATABLE READ的隔离级别下,一些情况下select…lock in shared modeS lock)会阻塞住updateX lock)操作(同一个主键id),可以REPEATABLE READ

4.2.2 READ COMMITTED

Session1:

852a330ef4ea8e6e2c8f7783ac44fb4b04f333bf

Session2:

1b49def8118bc3e0254e44203657f33621b475c0

Session3执行show engine innodb status\G:

34fd940c6dc17101de5a4c6b758985a74f24a070

如上可见,在READ COMMITTED的隔离级别下,一些情况下select…lock in shared modeS lock)会阻塞住updateX lock)操作(同一个主键id)

 

4.3 Phantom Rows测试

4.3.1 REPEATABLE READ

Session1:

597f6a4dc54d5e89a8140918cccdad081de1797c

Session2:

982cb1e28843a78d721045a09262f06dfeb97cb3

Session3执行show engine innodb status\G:

2207f8e8cf889481983428ab5f574209de9bfffc

如上可见,在REPEATABLE READ的隔离级别下, 一些情况下select…lock in shared modegap lock+S lock)会阻塞住insertX lock)操作,防止幻读

 

4.3.2 READ COMMITTED

Session1:

081e69f041a6025de77287d28880783ea64d7f57

Session2:

cd24129585f36e3e09e8b05b3797c0299c7a8a46

Session1:

6cb83e939107c38db11ba0f9653c273fe07dd21c

如上可见,在READ COMMITTED的隔离级别下无法避免Phantom Rows

 

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
10月前
|
机器学习/深度学习 人工智能 自然语言处理
技术创新领域,AI(AIGC)是否会让TRIZ“下岗”?
法思诺创新直播间探讨了AI(AIGC)是否将取代TRIZ的问题。专家赵敏认为,AI与TRIZ在技术创新领域具有互补性,结合两者更务实。TRIZ提供结构化分析框架,AI加速数据处理和方案生成。DeepSeek、Gemini等AI也指出,二者各有优劣,应在复杂创新中协同使用。企业应建立双轨知识库,重构人机混合创新流程,实现全面升级。结论显示,AI与TRIZ互补远超竞争,结合二者是未来技术创新的关键。
380 0
|
11月前
|
存储 固态存储 文件存储
一台电脑最多能接几个硬盘?
电脑硬盘扩展指南:从硬件接口(SATA、M.2、USB)到供电散热,再到操作系统盘符限制,本文全面解析一台电脑最多能接多少硬盘。普通用户适合2-4块硬盘,专业人士可扩展至8块以上,企业服务器则无明确上限。通过RAID阵列或NAS设备,还能突破传统限制,满足海量存储需求。了解这些技巧,助您合理规划存储方案!
|
6月前
|
Ubuntu 安全 Linux
2024 年最适合高级用户的 11 个 Linux 发行版
当然,上述列举的只是众多可用Linux发行版中的一小部分,远远不能穷尽全部。目前,全球有600多个Linux发行版,其中大约有500个处于积极开发的状态。 然而,我们认为有必要关注一些广泛应用的发行版,其中一些发行版的设计理念甚至影响了其他Linux发行版的风格与发展方向。这些发行版在Linux社区中扮演着重要的角色,并因其独特的特点和广泛的用户群体而备受关注。
|
监控 Linux
如何检查 Linux 内存使用量是否耗尽?这 5 个命令堪称绝了!
本文介绍了在Linux系统中检查内存使用情况的5个常用命令:`free`、`top`、`vmstat`、`pidstat` 和 `/proc/meminfo` 文件,帮助用户准确监控内存状态,确保系统稳定运行。
2472 6
|
消息中间件 监控 Java
RocketMQ 同步发送、异步发送和单向发送,如何选择?
本文详细分析了 RocketMQ 中同步发送、异步发送和单向发送三种消息发送方式的原理、优缺点及适用场景。同步发送可靠性高但延迟较大,适合订单系统等场景;异步发送非阻塞且延迟低,适用于实时数据处理等场景;单向发送高效但可靠性低,适用于日志收集等场景。文章还提供了示例代码和核心源码分析,帮助读者更好地理解每种发送方式的特点。
2344 4
|
9月前
|
Arthas 存储 监控
Arthas heapdump(dump java heap, 类似 jmap 命令的 heap dump 功能)
Arthas heapdump(dump java heap, 类似 jmap 命令的 heap dump 功能)
705 8
|
供应链 算法 定位技术
运筹优化技术在供应链领域应用介绍
运筹优化技术在供应链领域应用介绍
1561 0
|
人工智能 IDE 测试技术
一文教会你如何用好通义灵码,让这款 AI 编码工具帮你做更多工作,更高效
如何用好通义灵码?欢迎收藏最佳使用指南。本文提供通义灵码使用指南,涵盖快捷键、配置调整、跨文件索引及上下文管理等内容,帮助用户更高效地使用通义灵码。
10603 3