0

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

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

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

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

4

1 回答 1

1

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

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

于 2013-11-17T07:16:58.747 回答