【发布时间】:2015-04-09 07:13:10
【问题描述】:
我想收集有关 PostgreSQL 死锁中“赢家”事务和“输家”事务的事后调试信息。
- 我找到了this wiki 页面,其中包含一些很好的实时视图,可以提示当前出了什么问题,但如果我理解正确,那么当失败的交易已经被滚动时大部分最有用的信息已经从这些实时视图中删除。
- 我看到了诸如deadlock_timeout 和log_lock_waits 之类的选项,它们记录了有关失败交易的信息,但特别是没有记录获胜交易的信息。似乎没有任何方法可以自定义生成的日志输出以包含比这更详细的信息(值得注意的是,当我在事后基于日志进行调试时,这些整数都没有任何意义):
LOG: process 11367 still waiting for ShareLock on transaction 717 after 1000.108 ms DETAIL: 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时,所有涉及的进程都应该触发log_lock_waits。您缺少什么信息?
标签: postgresql transactions database-deadlocks