MySQL

BEGIN 之后,快照并没有马上建好

RR 隔离级别下做个实验:事务 B 开始后、第一次读之前,让 C 把 k 从 1 改成 7 并提交。

sql
-- B
BEGIN;
-- (这时 C 提交了 k = 7)
SELECT k FROM t WHERE id = 1;   -- 7

-- 换成这个
START TRANSACTION WITH CONSISTENT SNAPSHOT;
-- (这时 C 提交了 k = 7)
SELECT k FROM t WHERE id = 1;   -- 1

BEGIN 只是标记事务开始,执行到第一条普通 SELECT 时才建快照。WITH CONSISTENT SNAPSHOT 当场就建(只在 RR 下有意义)。

写业务代码一般不用关心这个,用驱动提供的 BeginTx 就行。但读教材里的时序例子时,这一点决定了结果。

esc