PostgreSQL Serializable 可以安全地与较低的隔离级别混合使用吗?
Can PostgreSQL Serializable be safely mixed with lower isolation levels?
我试图弄清楚混合使用 Serialisable 和较低级别的隔离时的行为是什么,但运气不佳。具体来说,我们有一个 reorder-queue-items 事务,当前正在使用 table 锁以确保在此期间不会向其中添加新项目。将其序列化并读取队列的头部(以确保对结果的依赖性)提供相同级别的保证,即使其他事务在 Repeatable Read 操作?
使用 PostgreSQL 9.5。
PS。我知道有 another question with a similar title,但它已经有 4 年多的历史了,它所问的内容更不具体,而且根据引用的材料,唯一的答案基本上没有来源,也没有真正回答问题。
为了保证可串行化,所有参与的事务都应该使用 SERIALIZABLE
隔离级别。
但我不确定可序列化隔离是否能解决您的问题。它不会阻止任何人读取或写入队列,它会使一些事务失败,失败的事务很可能是试图重新排序队列的事务。
我认为在这种情况下,锁是解决之道。使用可序列化事务对性能的影响同样糟糕,区别在于你必须不断重试事务,直到重新排序成功。
我试图弄清楚混合使用 Serialisable 和较低级别的隔离时的行为是什么,但运气不佳。具体来说,我们有一个 reorder-queue-items 事务,当前正在使用 table 锁以确保在此期间不会向其中添加新项目。将其序列化并读取队列的头部(以确保对结果的依赖性)提供相同级别的保证,即使其他事务在 Repeatable Read 操作?
使用 PostgreSQL 9.5。
PS。我知道有 another question with a similar title,但它已经有 4 年多的历史了,它所问的内容更不具体,而且根据引用的材料,唯一的答案基本上没有来源,也没有真正回答问题。
为了保证可串行化,所有参与的事务都应该使用 SERIALIZABLE
隔离级别。
但我不确定可序列化隔离是否能解决您的问题。它不会阻止任何人读取或写入队列,它会使一些事务失败,失败的事务很可能是试图重新排序队列的事务。
我认为在这种情况下,锁是解决之道。使用可序列化事务对性能的影响同样糟糕,区别在于你必须不断重试事务,直到重新排序成功。