繁体   English   中英

从后端提交空闲的事务查询

[英]Committing Idle in transaction query from backend

我在pg_stat_activity找到了一个查询,该查询当前<IDLE> in transaction中为<IDLE> in transaction

如果我叫pg_cancel_backend此查询的procpid ,事务将被回滚。 我对吗?

如何从数据库控制台向事务发出commit命令?

是否有pg_commit_backend(procpid)或类似的东西?

想要提交的原因是,我无法跟踪此查询的来源,并且可能来自错误代码。 但是,我无法回滚,因为这将导致事务在闲置之前丢失。 从后端提交将很有用,这样查询可以释放其锁,而其他等待查询可以继续进行。

您不能从正在运行的后端外部提交事务。 您需要跟踪并修复错误的代码。 无法从正在运行的会话外部强制提交。

您是正确的pg_terminate_backend将回滚事务。 同样, pg_cancel_backend将取消正在运行的查询,并在该过程中回滚事务。

如果您不知道交易完成了什么或在哪个阶段进行,则无论如何都要提交它是错误的。 您不知道它是否正在进行一些工作,即使它闲置了一段时间也是如此。

好的,如果您真的很绝望,则可以使用gdb通过使用调试器附加到后端来注入commit命令。 这是冒险的,而且是一次绝望的一次性行为,例行或自动执行并不遥不可及,并且不适用于您的代码似乎例行退出事务中空闲会话的情况。

您是否使用有用的log_line_prefix记录所有查询? 如果是这样,您可以从日志中重建它们。

绝望的另一个选择是使用pg_dirtyread或类似的工具来读取未提交/回滚的数据。 还将看到已删除的数据, update d行的旧版本的数据等,因此需要进行大量排序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM