我想知道更新的行为,以及它们是否在事务之间进行协调:
例如,如果Alice的起始余额为500,并且两个事务同时执行(在两个不同的连接上):
UPDATE Account SET balance = balance - 100 WHERE name = 'Alice';
... long time ...
UPDATE Account SET balance = balance + 100 WHERE name = 'Bob';
和
UPDATE Account SET balance = balance - 50 WHERE name = 'Charlie';
... long time ...
UPDATE Account SET balance = balance + 50 WHERE name = 'Alice';
波斯特格斯会确保艾丽斯的平衡永远是450吗?还是有时是550或400取决于交易的执行方式?
例如
这是一个很大的假设,但我假设对于ACID,当事务启动时,它将冻结给定事务的数据库状态:
当两个事务完成时-A的余额为400,事务B的余额为550。
因此,数据库需要知道在同一个地方进行了两次更新,并对此进行了协调。
发布于 2021-02-11 23:45:47
结果将永远是450。UPDATE
语句在PostgreSQL中是原子的,不可能丢失更新。
原因是PostgreSQL在它更新的行上获取了一个独占锁,如果它必须等待获得锁,它将在获得锁后重新读取该行。使用默认的READ COMMITTED
隔离级别,可以确保事务将看到最近的值,并且不会出现丢失更新的争用条件。(使用REPEATABLE READ
,您将得到一个序列化错误。)
文献资料毫不含糊地描述了这一点。
https://stackoverflow.com/questions/66165521
复制