我在pg_stat_activity
中找到了一个当前为<IDLE> in transaction
的查询。
如果我在此查询的pg_cancel_backend
上调用procpid
,则会回滚该事务。我是对的吗?
如何从我的数据库控制台向事务发出commit
命令?
是否有pg_commit_backend(procpid)
或类似内容?
想要提交的原因是,我无法追踪此查询的来源,而且可能来自有缺陷的代码。但是,我无法回滚,因为这将导致在事务闲置之前丢失事务。从后端提交以便查询可以释放其锁定以及其他等待查询可以继续进行将非常有用。
答案 0 :(得分:5)
您无法从正在运行的后端之外提交事务。您需要追踪并修复错误代码。没有办法在正在运行的会话之外强制提交。
pg_terminate_backend
将回滚事务是正确的。同样,pg_cancel_backend
将取消正在运行的查询,并在此过程中回滚事务。
如果您不知道交易已经完成了什么或者它处于什么阶段,那么无论如何都要提交它是错误的。你不知道它是否已经完成了一些工作,即使它已经闲置了一段时间。
好的,如果你真的很绝望,你可以使用gdb
通过使用调试器附加到后端来注入commit
命令。这是冒险的,实际上是一次性的绝望行为,通常或自动执行并不是很明智,并且它不适合您的情况,因为您的代码似乎通常会在交易中闲置会话。
您是否使用有用的log_line_prefix
记录了所有查询?如果是这样,您可以从日志中重建它们。
另一种解压方法是使用pg_dirtyread
或类似工具来读取未提交/回滚的数据。您还会看到已删除的数据,旧版update
行的数据等等,因此需要进行一系列的排序。