调试 PostgreSQL 序列化失败

Dan*_*Dan 6 postgresql isolation-level serialization postgresql-9.4

我想我们的PostgreSQL 9.4的事务级数据库迁移READ COMMITTED要么REPEATABLE READSERIALIZABLE。在任何一种情况下,我都会遇到一组新的格式错误:

(for both)
ERROR:  could not serialize access due to concurrent update
(just for SERIALIZABLE)
ERROR:  could not serialize access due to read/write dependencies among transactions
Run Code Online (Sandbox Code Playgroud)

在阅读了 SSI 上的 wiki 页面文档后,我彻底了解了可能导致这些错误的错误条件、如何处理它们,甚至是避免它们的最佳实践。

但是,我看不到从 PostgreSQL 可以提供的任何调试输出或任何调试信息中确定导致它们的数据依赖性的方法。有没有办法从数据库中获取这些信息,要么在回滚时执行额外的查询,要么通过某种日志机制?

有了这些信息,我就可以进行应用程序级别的更改(锁定、不同的查询等),从而消除一些数据竞争以避免过多的回滚。

Cra*_*ger 5

拥有它会很好,但我认为目前没有太多东西。这特别棘手,因为经常涉及多个语句,而且罪魁祸首并不总是当前正在运行的语句,尤其是在提交失败时。收集额外信息对性能和内存使用来说是毁灭性的,但在调试时能够打开它是一个很好的选择。

您最好的办法可能是大大提高您的日志级别,并确保您有一个log_line_prefix包含%m, %p,%c:%l%v:%x的事务和会话信息,以便识别和重新组合日志中的会话及其 xacts。