验证mysql RR隔离水平,并未完全实现防止幻读的实验

-- ==============================================

-- 会话A - 幻读实验主事务(整段复制,按执行提示分步跑)

-- ==============================================

-- 1. 环境准备:删旧表+建测试表+关自动提交+确认隔离级别

DROP TABLE IF EXISTS test_phantom;

CREATE TABLE test_phantom (id INT PRIMARY KEY, name VARCHAR(20) NOT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

SET SESSION autocommit = 0;

SELECT @@transaction_isolation AS '当前隔离级别'; -- 预期结果:REPEATABLE-READ

-- 2. 启动事务+首次快照读(创建ReadView,核心步骤)

START TRANSACTION;

SELECT * FROM test_phantom WHERE id=1; -- 预期结果:空集(表无数据)

-- ========== 到此为止!先停在这里,切换到【会话B】执行完所有代码,再切回A继续下面的步骤 ==========

-- 3. 二次快照读(复用ReadView,依然读不到数据,RR纯快照读特性)

SELECT * FROM test_phantom WHERE id=1; -- 预期结果:还是空集(没幻读,防住了纯快照读)

-- 4. 执行UPDATE当前读(绕开ReadView,抓取会话B提交的最新数据)

UPDATE test_phantom SET name='innodb_phantom' WHERE id=1; -- 预期结果:Rows matched:1 Changed:1(执行成功)

-- 5. 三次快照读(幻读出现!同一事务相同查询,从空变有)

SELECT * FROM test_phantom WHERE id=1; -- 预期结果:(1, 'innodb_phantom') 【核心幻读现象】

-- 6. 提交事务,结束实验

COMMIT;

-- ==============================================

-- 会话B - 插入数据并提交(整段复制,直接全跑)

-- ==============================================

-- 环境准备:仅关闭自动提交即可(表由会话A创建,无需重复建)

SET SESSION autocommit = 0;

-- 插入id=1数据并立即提交(数据对外可见,触发幻读的前提)

START TRANSACTION;

INSERT INTO test_phantom VALUES (1, 'mysql_rr'); -- 预期结果:插入成功,影响行数1

COMMIT; -- 提交后数据持久化,对其他会话可见

相关推荐
码农阿豪4 小时前
行标识符的抉择:深入理解数据库领域的OID与ROWID机制
数据库·oracle
不剪发的Tony老师4 小时前
MyCLI:一个增强型MySQL命令行客户端
数据库·mysql
SHANGHAILINGEN4 小时前
2400 万个未培养病毒重新定义病毒多样性
数据库·测序·组学
刘晨鑫14 小时前
PostgreSQL日常维护
数据库·postgresql
xiaokangzhe4 小时前
PG数据库日常应用
数据库·oracle
XDHCOM5 小时前
MySQL ER_DD_VERSION_INSTALLED报错解析,数据字典版本问题,故障修复与远程处理指南
数据库·mysql
yaoyouzhong6 小时前
MySQL 批量插入详解:快速提升大数据导入效率的实战方法
大数据·数据库·mysql
NineData7 小时前
NineData V5.0 产品发布会:让 AI 成为数据管理的驱动力,4月16日!
数据库·人工智能·ai编程
高梦轩7 小时前
PG数据库
数据库·oracle
云草桑8 小时前
DBA mssql 解决排序规则冲突 QA prod 和开发配置都是一样的服务器排序规则 为啥开发环境的的存储过程需要 加这个COLLATE Chinese_PRC_CI_AS
数据库·dba·mssql