我理解在MySQL
和PostgreSQL
中,REPEATABLE READ
隔离级别会使读取在事务开始时看到快照。但是在https://dev.mysql.com/doc/refman/8.0/en/innodb-consistent-read.html的MySQL文档中
下面的注释用一个例子提到
数据库状态的快照适用于其中的SELECT语句 一个事务,不一定是DML语句。如果您插入或 修改一些行,然后提交该事务,DELETE或UPDATE 从另一个并发REPEATABLE READ事务发出的语句 可能会影响那些刚刚提交的行,即使会话可以 不查询它们。如果事务确实更新或删除已提交的行 通过不同的交易,这些变化确实变得可见 当前交易。例如,您可能会遇到类似的情况 以下内容:
SELECT COUNT(c1) FROM t1 WHERE c1 = 'xyz';
-- Returns 0: no rows match.
DELETE FROM t1 WHERE c1 = 'xyz';
-- Deletes several rows recently committed by other transaction.
SELECT COUNT(c2) FROM t1 WHERE c2 = 'abc';
-- Returns 0: no rows match.
UPDATE t1 SET c2 = 'cba' WHERE c2 = 'abc';
-- Affects 10 rows: another txn just committed 10 rows with 'abc' values.
SELECT COUNT(c2) FROM t1 WHERE c2 = 'cba';
-- Returns 10: this txn can now see the rows it just updated.
对于PostgreSQL,相同的例子是否适用,或者它不允许这样的行为?
答案 0 :(得分:0)
这在PostgreSQL中不会发生。
如果REPEATABLE READ
事务A在 A拍摄快照后尝试修改已由并发事务B 修改的行,则A将收到“序列化错误”。< / p>