[英]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.