我正在尝试将我们的 PostgreSQL 9.4 数据库从事务级别迁移READ COMMITTED
到REPEATABLE READ
or 或SERIALIZABLE
. 无论哪种情况,我都会遇到一组新的格式错误:
(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
在阅读了有关 SSI 的 wiki 页面和文档后,我彻底了解了可能导致这些错误的错误条件、如何处理它们,甚至是避免它们的最佳实践。
但是,我看不到任何方法可以确定导致它们从 PostgreSQL 可以提供的任何调试输出或任何调试信息中产生的数据依赖性。有没有办法从数据库中获取这些信息,或者通过在回滚时执行额外的查询,或者通过一些日志机制?
拥有这些信息将使我能够进行应用程序级别的更改(锁定、不同的查询等),从而消除一些数据竞争以避免过多的回滚。
拥有它会很好,但我认为目前没有太多东西。这特别棘手,因为经常涉及多个语句,并且罪魁祸首并不总是当前正在运行的语句,尤其是在提交失败时。收集额外的信息对于性能和内存使用来说是毁灭性的,但是在调试时能够打开它是一个很好的选择。
您最好的选择可能是大大提高您的日志级别,并确保您有一个
log_line_prefix
include%m
,%p
,%c:%l
因此%v:%x
您拥有识别和重组哪些会话及其 xact 从日志中所做的事务和会话信息。