把隔离级别切到READ COMMITTED,跑跟上一篇一模一样的两连接实验,看同一个事务里连续读到的结果这次是不是还保持不变。
上一篇REPEATABLE READ下,A的事务两次读到的是同一份快照;这次换成READ COMMITTED,跑同样的流程。
操作时间线连接A: SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED 连接A: START TRANSACTION 连接A: SELECT COUNT(*) FROM t4 → 结果 3 连接B: INSERT INTO t4 (v) VALUES (100),(200) (立刻提交) 连接A: SELECT COUNT(*) FROM t4 → 结果?(同一事务,第二次读) 连接B: INSERT INTO t4 (v) VALUES (300) (又提交一次) 连接A: SELECT COUNT(*) FROM t4 → 结果?(同一事务,第三次读)
对比上一篇REPEATABLE READ下A两次读都是3的结果。
结果A第一次读(B插入之前): 3 B第一次插入并提交(2行) A第二次读(同一事务,READ COMMITTED): 5 ← 变了!立刻看到B刚提交的 B第二次插入并提交(1行) A第三次读(同一事务): 6 ← 又变了,再次看到B新提交的
同样是"同一个事务里连续读三次",READ COMMITTED下每一次都拿到最新的已提交数据:3 → 5 → 6,跟着B的两次提交同步变化。而上一篇REPEATABLE READ下,同样的操作序列,A的读取结果全程停在3,直到A自己提交。
每一步都是本文上面用两个MySQL连接跑出来的原始结果,与上一篇REPEATABLE READ的结果形成对照。