如何在使用 PostgreSQL 可序列化事务时声明一个不重要的表


How to declare a table not-important when using PostgreSQL serializable transactions?

我正在使用PostgreSQL 9.1和可序列化的事务(类似于谓词锁定),我遇到了错误could not serialize access due to read/write dependencies among transactions。我相信这是由于访问包含不需要由可序列化事务保护的数据的表引起的。但是,代码逻辑的其余部分依赖于可序列化事务支持,因此我需要对其余表使用可序列化事务。

是否可以配置 PosgreSQL、数据库模式或事务,以便我可以启动可序列化事务,并且仍然声明表 XYZ 中的任何序列化失败都不值得中止(回滚)事务?如果是这样,该怎么做?

我知道的问题的唯一解决方案是将所有不重要的表放在另一个数据库中,并使用平行连接和事务到该数据库。我希望有一个更简单的解决方案。我的应用程序是用PHP编写的,以防万一。

更新:我正在寻找额外的性能;代码会自动重试失败的事务,经过足够多的重试后,它最终会通过,所以理论上我很好。在实践中,性能很糟糕。

PostgreSQL不允许你指定这种东西。 如果是这种情况,您应该根本不使用可序列化的事务级别,而是使用更明确的锁定(选择...用于更新等)。 这可能会导致死锁,但可以避免您现在遇到的问题。 您可以通过在事务的早期读取已提交并锁定相关行来模拟这种情况。

我不太确定您可以在多大程度上在用户定义的函数中使用异常处理来解决此问题。 我认为这应该是可能的,因为函数至少在理论上能够处理它们自己的所有异常。 但是,我会担心弄乱交易担保的影响。