Mar*_*oma 5 postgresql concurrency isolation-level
我读过《深入了解 MySQL 和 PostgreSQL 中的隔离级别》和《读取现象》,尤其是“Postgres 中的序列化异常”部分。我想我已经理解了那里描述的问题,但是我很难判断它何时会在我的应用程序中发生。
是否只有使用 SUM/COUNT 这样的聚合函数才能在 Postgres 中获得序列化异常?如果不是,我还需要注意什么?
吉姆·格雷(Jim Gray)有一个例子。
数据库中有两行。一个具有“白色”值,另一个具有“黑色”值。事务T1将所有白色更新为黑色,T2将所有黑色更新为白色。
update table
set value = 'black'
where value = 'white'
Run Code Online (Sandbox Code Playgroud)
每个事务只读取一行并写入同一行。每个事务的工作集是完全不相交的。在悲观并发控制下,不需要任何锁冲突。乐观情况下不存在写集冲突。
为了可序列化,我们最终必须将所有值设置为白色或全黑色。然而,如果以较低的隔离度并发运行,我们可以以行交换值来结束。