首页 > 解决方案 > PostgreSQL Serializable 可以安全地与较低的隔离级别混合使用吗?

问题描述

我试图弄清楚混合可序列化和较低级别的隔离时的行为是什么,但运气不佳。具体来说,我们有一个 reorder-queue-items 事务,它当前正在获取表锁,以确保在此期间不会添加新项目。将其序列化并读取队列的头部(以确保对结果的依赖)是否会提供相同级别的保证,即使其他事务以可重复读取操作?

使用 PostgreSQL 9.5。

PS。我知道还有一个类似标题的问题,但它已经超过 4 年了,它所问的具体内容要少得多,鉴于引用的材料,唯一的答案基本上是没有来源的,并且没有真正回答这个问题。

标签: postgresqltransactionsisolation-level

解决方案


为了保证可序列化,所有参与的事务都应该使用SERIALIZABLE隔离级别。

但我不确定可序列化隔离是否能解决您的问题。它不会阻止任何人读取或写入队列,它会使一些事务失败,而失败的事务很可能是试图重新排序队列的事务。

我认为在这种情况下,锁是要走的路。使用可序列化事务同样会影响性能,不同之处在于您必须不断重试事务,直到重新排序成功,而不是等待。


推荐阅读