繁体   English   中英

使用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我遇到could not serialize access due to read/write dependencies among transactions错误。 我认为这是由于访问包含不需要由可序列化事务保护的数据的表引起的。 但是,其余的代码逻辑取决于可序列化事务的支持,因此我需要对其余表使用可序列化事务。

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

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

更新 :我在寻找额外的性能 ; 该代码会自动重试失败的事务,并且经过足够多的重试后最终将通过,因此从理论上讲我很好。 在实践中,性能糟透了。

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

我不太确定在多大程度上可以在用户定义的函数中使用异常处理来解决此问题。 我认为应该是可行的,因为函数至少在理论上能够处理其自身的所有异常。 但是我担心担心交易担保的含义。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM