我有一个典型的 Java Spring + Postgres 环境(该项目是遗留项目)。后端的持久层混合了声明的隔离级别——其中一些是默认的,即 READ COMMITED,另一些是 REPEATABLE READ,还有一些是 SERIALIZABLE。
有时,从具有不同隔离级别的并行事务访问相同的数据库表。
此类交易的交互是否有一些严格的规则?
我或多或少可以理解这种情况,当所有事务具有相同的隔离级别并且其中一些事务声明显式锁以细粒度避免不良读取现象时,但不是上述情况。
我有一个典型的 Java Spring + Postgres 环境(该项目是遗留项目)。后端的持久层混合了声明的隔离级别——其中一些是默认的,即 READ COMMITED,另一些是 REPEATABLE READ,还有一些是 SERIALIZABLE。
有时,从具有不同隔离级别的并行事务访问相同的数据库表。
此类交易的交互是否有一些严格的规则?
我或多或少可以理解这种情况,当所有事务具有相同的隔离级别并且其中一些事务声明显式锁以细粒度避免不良读取现象时,但不是上述情况。
混合不同的隔离级别是没有问题的,每个事务都会按照规范行事。例如,在
REPEATABLE READ
事务中,您将看到数据库的稳定快照,无论其他事务具有哪些隔离级别。这里最大的例外是
SERIALIZABLE
. 如果要保证可序列化,所有涉及的事务都必须是可序列化的,以便它们获取所需的谓词锁。如果混合隔离级别,则不再保证有等效的串行执行。如果您考虑一下,它是有道理的:可串行化是对整个工作负载的约束,而不仅仅是对单个事务的约束。