sql—mysql和postgresql中可重复读取语义的差异

tzxcd3kk  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(325)

这两方面我都理解 MySQL 以及 PostgreSQL ,的 REPEATABLE READ 隔离级别将使读取在事务开始时看到快照。但是在mysql文档中https://dev.mysql.com/doc/refman/8.0/en/innodb-consistent-read.html 下面是一个例子
数据库状态的快照应用于事务中的select语句,而不一定应用于dml语句。如果插入或修改某些行,然后提交该事务,则从另一个并发可重复读取事务发出的delete或update语句可能会影响那些刚刚提交的行,即使会话无法查询它们。如果某个事务确实更新或删除了其他事务提交的行,则这些更改对当前事务是可见的。例如,您可能会遇到如下情况:

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,或者它不允许这样的行为?

bxgwgixi

bxgwgixi1#

这在postgresql中是不可能发生的。
如果 REPEATABLE READ 事务a尝试修改已被并发事务b修改的行在a的快照拍摄完成后,a将收到“序列化错误”。

相关问题