我在 pg_stat_activity
中找到,当前为 <IDLE> in transaction
的查询.
如果我调用 pg_cancel_backend
在这个查询的 procpid
,事务将被回滚。我说得对吗?
我怎样才能发出 commit
从我的数据库控制台向事务发送命令?
有没有pg_commit_backend(procpid)
或类似的东西?
想要提交的原因是,我无法追踪这个查询的来源,它可能来自错误代码。但是,我不能回滚,因为这会导致事务空闲之前所做的事情丢失。从后端提交非常有用,这样查询就可以释放它的锁,并且其他等待的查询可以继续进行。
最佳答案
您不能从正在运行的后端外部提交事务。您需要追踪并修复错误代码。无法从正在运行的 session 外部强制提交。
pg_terminate_backend
将回滚事务是正确的。同样,pg_cancel_backend
将取消正在运行的查询并在此过程中回滚事务。
如果您不知道事务已完成什么或它处于什么阶段,无论如何提交它都是错误的。你不知道它是否已经完成了一些工作,即使它已经闲置了一段时间。
好吧,如果你真的很绝望,你可以使用 gdb
通过使用调试器附加到后端来注入(inject) commit
命令。这是有风险的,而且确实是一次性的绝望行为,例行或自动执行远不是理智的,并且它不适合您的情况,因为您的代码似乎经常离开事务中的空闲 session 。
您是否使用有用的 log_line_prefix
记录所有查询?如果是这样,您可以从日志中重建它们。
绝望的另一种选择是使用pg_dirtyread
或类似的工具来读取未提交/回滚的数据。您还会看到已删除的数据、更新
行的旧版本数据等,因此需要进行大量整理工作。
关于sql - 从后端在事务查询中提交空闲,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21701102/