我已阅读深入了解 MySQL 和 PostgreSQL 中的隔离级别和阅读现象,尤其是“Postgres 中的序列化异常”部分。我想我已经理解了那里描述的问题,但是我很难判断它何时会在我的应用程序中发生。
是否只有使用 SUM/COUNT 等聚合函数才能在 Postgres 中获得序列化异常?如果不是,我还需要注意什么?
我已阅读深入了解 MySQL 和 PostgreSQL 中的隔离级别和阅读现象,尤其是“Postgres 中的序列化异常”部分。我想我已经理解了那里描述的问题,但是我很难判断它何时会在我的应用程序中发生。
是否只有使用 SUM/COUNT 等聚合函数才能在 Postgres 中获得序列化异常?如果不是,我还需要注意什么?
有一个归因于吉姆格雷的例子。
数据库中有两行。一个具有“白色”值,另一个具有“黑色”值。事务 T1 将所有白色更新为黑色,T2 将所有黑色更新为白色。
每个事务只读取一行并写入同一行。每个事务的工作集是完全不相交的。在悲观并发控制下,不需要任何锁冲突。在乐观的情况下,没有写集冲突。
为了可序列化,我们必须以所有值结束为白色或全黑。但是,如果以较低的隔离度同时运行,我们可以以行交换值结束。