我想收集有关PostgreSQL死锁中“赢家”事务和“输家”事务的事后调试信息。
我找到了wiki页面,其中包含一些很好的实时视图,可以提示当前的错误,但是如果我理解正确,当丢失的事务已经回滚时,大多数最有用的信息已经从这些实时视图中删除。
我看到了thisdeadlock_timeout这样的选项,它们记录了有关失败交易的信息,但特别是不记录获胜交易的信息。似乎没有任何方法可以自定义生成的日志输出以包含比这更详细的信息(特别是,当我在事后基于日志进行调试时,这些整数都没有任何意义):
LOG: process 11367 still waiting for ShareLock on transaction 717 after 1000.108 msDETAIL: Process holding the lock: 11366. Wait queue: 11367.CONTEXT: while updating tuple (0,2) in relation "foo"STATEMENT: UPDATE foo SET value = 3;
有没有更好的数据源可以用来收集这些信息?

最佳答案

首先,粘贴到问题中的跟踪不是死锁跟踪,而是关于资源锁的警告,这些资源锁的可用时间不够长(超过deadlock_timeout)。这不是错误,也不会中止事务,而死锁对事务是致命的。
我想收集关于
PostgreSQL中的“赢家”交易和“输家”交易
僵局。
它们与终止的查询一起出现在服务器日志中。
例如,对于这个问题中提到的情况,这里有一个带有log_line_prefix = '%t [%p] '的死锁跟踪:postgres deadlock without explicit locking
2015-04-09 15:16:42 CEST[21689]错误:检测到死锁
2015-04-09 15:16:42 CEST[21689]详细信息:进程21689在事务1866436上等待共享锁;被进程21028阻止。
进程21028等待事务1866435上的共享锁;被进程21689阻止。
过程21689:插入b值(1);
过程21028:插入值(1);
2015-04-09 15:16:42 CEST[21689]提示:查询详细信息请参见服务器日志。
2015-04-09 15:16:42 CEST[21689]声明:插入b值(1);
“looser”是PID21689作为错误的产生者。“胜利者”是因为他是另一个。
如果从客户的角度来看,它会得到以下信息:
错误:检测到死锁
详细信息:进程21689在事务1866436上等待共享锁;被进程21028阻止。
进程21028等待事务1866435上的共享锁;被进程21689阻止。
提示:有关查询详细信息,请参阅服务器日志。
没有提到查询,但这是客户端刚刚发送的查询。没有提到更松散的,但它是一个得到这个错误,另一个不必注意任何事情。

08-26 08:20