交易中什么时候真正拍摄快照?在
BEGIN TRANSACTION
上还是在第一次操作时?
我一直在使用 REPEATABLE READ 隔离级别尝试 MySQL 和 PostgreSQL 中的事务,并且我注意到一些意外的情况:
我启动了两笔交易,
T1
和T2
。启动 T1
后,我在 T2
中进行更改(例如更新行),并且我仍然可以在 T1
中看到这些更改,直到我在 T1
中执行第一个查询(读取或写入)。看起来快照不是在 BEGIN TRANSACTION
创建的,而是在事务中的第一个操作之后创建的。
这是 MySQL 和 PostgreSQL 中的预期行为吗?事务中快照隔离具体什么时候开始?
https://dev.mysql.com/doc/refman/en/innodb-transaction-isolation-levels.html有答案:
同一事务内的一致读取会读取第一次读取建立的快照。