MySQL和PostgreSQL中可重复读取语义的区别

时间:2018-06-06 02:51:03

标签: mysql sql postgresql transaction-isolation

我理解在MySQLPostgreSQL中,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,相同的例子是否适用,或者它不允许这样的行为?

1 个答案:

答案 0 :(得分:0)

这在PostgreSQL中不会发生。

如果REPEATABLE READ事务A在 A拍摄快照后尝试修改已由并发事务B 修改的行,则A将收到“序列化错误”。< / p>