这两方面我都理解 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,或者它不允许这样的行为?
1条答案
按热度按时间bxgwgixi1#
这在postgresql中是不可能发生的。
如果
REPEATABLE READ
事务a尝试修改已被并发事务b修改的行在a的快照拍摄完成后,a将收到“序列化错误”。