序列化异常:还有谁参与?

Posted

技术标签:

【中文标题】序列化异常:还有谁参与?【英文标题】:Serialization exception : Who else was involved? 【发布时间】:2014-11-24 12:23:33 【问题描述】:

当作为 SERIALIZABLE 隔离级别的事务失败时,有没有办法知道整个过程中涉及了哪些连接(即事务)?

我正在开发一个会计数据库。我知道我们应该重试事务,这就是我们所做的。我遇到了一个事务必须运行 10 次才能在繁忙的系统上成功的问题。

这里应该有一个严重的问题。我想知道是否有一个配置参数可以让系统在异常详细信息中告诉失败中涉及的其他连接。

SSI 上的 Postgresql wiki 没有此类信息。

先谢谢了。

编辑 1

我将日志推送到 DEBUG5 级别,但没有运气。

所以我决定看一下代码。序列化冲突检测在 src/backend/storage/lmgr/predicate.c 中完成,其中注定要失败的事务用 SXACT_FLAG_DOOMED 标志标记。

我只是在 DEBUG1 级别添加了 elog(...) 调用,编译了代码并试一试。

这很有趣,因为它现在向我展示了类似的内容:

    2014-11-28 09:52:47 CET [9888]: [1-1] db=postgres,user=postgres DEBUG:  00000: 
SERIALIZABLE TX on Connection [12864] is marked DOOMED by SERIALIZABLE TX on Connection [9888]

现在我有了了解正在发生的事情的构建基块。

【问题讨论】:

在您解决了这个问题之后,您应该考虑现在或以后将您的编辑作为答案。 SO 社区可能会发现您在故障排除中添加的代码非常有用。它也可能是对 PostgreSQL 本身的有用贡献,可能是一个新的日志记录选项。 您可以关注 PostgreSQL 黑客列表中有关此主题的讨论:postgresql.org/message-id/… 谢谢,我会跟进的。 【参考方案1】:

首先,查看主 PostgreSQL 日志文件。在我的盒子上,它位于 /var/log/postgresql 下。

之后,有一个lot of options 用于记录和错误报告。您可以记录连接尝试,并且可以记录每个 SQL 语句。您应该能够很好地了解服务器正在做什么。

我认为您应该阅读大部分链接文档。一些选项对服务器吞吐量有显着影响。

【讨论】:

我会尝试查看日志记录选项,重现问题并回来报告我的发现。 我将日志推送到 DEBUG5 级别,希望它能给我展示一些有趣的东西。没有运气。

以上是关于序列化异常:还有谁参与?的主要内容,如果未能解决你的问题,请参考以下文章

ArrayList集合中的elementData为什么不参与序列化?

5W1H聊开源之Who和How——谁如何参与开源?

timelion扩展--Kibana5.4时间序列分析

tomcat 报错 反序列化异常

为啥我的异常类需要序列化?

如何序列化异常