Php 使用PostgreSQL可序列化事务时,如何声明不重要的表?

Php 使用PostgreSQL可序列化事务时,如何声明不重要的表?,php,postgresql,serialization,transactions,Php,Postgresql,Serialization,Transactions,我将PostgreSQL 9.1用于可序列化事务(类似于谓词锁定),遇到错误无法序列化访问,因为事务之间存在读/写依赖关系。我认为这是由于访问了一个表,该表包含的数据不需要受可序列化事务保护。但是,其余的代码逻辑依赖于可序列化事务支持,因此我需要对其余的表使用可序列化事务 是否可以配置PosgreSQL、数据库架构或事务,以便启动可序列化事务,并且仍然声明表XYZ中的任何序列化失败都不值得中止(回滚)该事务?如果是,如何执行 我所知道的这个问题的唯一解决方案是将所有不重要的表放在另一个数据库中,

我将PostgreSQL 9.1用于可序列化事务(类似于谓词锁定),遇到错误
无法序列化访问,因为事务之间存在读/写依赖关系
。我认为这是由于访问了一个表,该表包含的数据不需要受可序列化事务保护。但是,其余的代码逻辑依赖于可序列化事务支持,因此我需要对其余的表使用可序列化事务

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

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


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

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


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

您有锁升级吗?您是否遇到“只读”表中包含seqscans的计划?顺便说一句:减少并发会话的数量总是一个好主意……显示示例代码是有问题的,因为我遇到这个问题的情况是,在许多并发事务中,我每个事务执行10-50个查询,而有问题的事务大约有1000-10000个查询。每个查询都非常简单,但PostgreSQL解释这些事务具有依赖关系(我猜会触发一些顺序扫描,因为PostgreSQL认为这是依赖关系)。使用PostgreSQL日志或其他工具调试未知依赖关系源的任何指针都很好,显式锁定也比当前情况更糟糕,因为长时间运行的事务将阻止所有并行快速事务(无法释放事务中的锁,因此任何锁都将持续到事务结束)。我目前正在自动重试这个巨大的事务,直到它成功为止,但有时需要很长的时间(对于一组大约10K的查询,需要几十次重复)。问题在于性能,而不是正确性。