sql - 从后端在事务查询中提交空闲

标签 sql postgresql transactions postgresql-9.1

我在 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/

相关文章:

sql-server - 分布式事务的性能开销

sql - 在 SQL Server 中创建相关矩阵

sql - 将周日期部分编号转换为周内的日期(...的一周)

postgresql - 在这种情况下,为什么 Postgresql 不对我的复合索引使用 Index Only Scan?

sql - 如何在 UPDATE 语句中使用 regexp_matches()?

c# - ADO.NET 在一个 sql 连接中重试事务

postgresql - 手动释放 Postgres LOCK

php - LAST_INSERT_ID 在 UPDATE 上不起作用

php - 如果存在更新,否则插入一个查询

regex - split_to_table() 按字符数,无定界符