不结束数据库事务的后果是什么?
What are the consequences of not ending a database transaction?
我在我的应用程序代码中发现了一个错误,我在其中启动了一个事务,但从未提交或执行回滚。定期使用连接,每 10 秒左右读取一些数据。在pg_stat_activity
table中,它的状态被报告为"idle in transaction",它的backend_start
时间是一个多星期前。
这对数据库有什么影响?它会导致额外的 CPU 和 RAM 使用吗?会影响其他连接吗?这种状态能坚持多久?
我正在使用 postgresql 9.1 和 9.4。
对系统有两大影响。
那些事务中使用过的表:
- 不是 vacuumed 这意味着它们不是 "cleaned up" 并且它们的统计信息不会更新,这可能会导致糟糕(=缓慢)的执行计划
- 无法使用
ALTER TABLE
进行更改
由于你只有SELECT
,影响有限。对于任何写操作来说都更严重,其中更改在提交之前对任何其他事务不可见 - 如果从未提交则丢失。
它确实消耗一些 RAM 并永久占用您允许的连接之一(这可能重要也可能无关紧要)。
非常长的 运行ning 事务的更严重后果之一:它阻止 VACUUM
完成它的工作,因为仍然有一个旧事务可以看到旧行。系统会开始膨胀。
特别是,SELECT
在所有引用的表上获取 ACCESS SHARE
锁(阻塞最少)。这不会干扰其他 DML 命令,如 INSERT
、UPDATE
或 DELETE
,但它会 阻止 DDL 命令 以及 TRUNCATE
或 VACUUM
(包括 autovacuum 作业)。 See "Table-level Locks" in the manual.
它还会干扰各种 复制 解决方案并导致 transaction ID wraparound in the long 运行 if it stay打开足够长的时间/你足够快地刻录足够多的 XID。更多关于 in the manual on "Routine Vacuuming".
如果其他事务被阻止提交并且那些事务已经获得了自己的锁,则阻塞效应会迅速发展。等等
您可以(几乎)无限期地保持事务打开 - 直到连接关闭(显然,这也会在服务器重新启动时发生。)
但永远不要让交易打开的时间超过需要的时间。
我在我的应用程序代码中发现了一个错误,我在其中启动了一个事务,但从未提交或执行回滚。定期使用连接,每 10 秒左右读取一些数据。在pg_stat_activity
table中,它的状态被报告为"idle in transaction",它的backend_start
时间是一个多星期前。
这对数据库有什么影响?它会导致额外的 CPU 和 RAM 使用吗?会影响其他连接吗?这种状态能坚持多久?
我正在使用 postgresql 9.1 和 9.4。
对系统有两大影响。
那些事务中使用过的表:
- 不是 vacuumed 这意味着它们不是 "cleaned up" 并且它们的统计信息不会更新,这可能会导致糟糕(=缓慢)的执行计划
- 无法使用
ALTER TABLE
进行更改
由于你只有SELECT
,影响有限。对于任何写操作来说都更严重,其中更改在提交之前对任何其他事务不可见 - 如果从未提交则丢失。
它确实消耗一些 RAM 并永久占用您允许的连接之一(这可能重要也可能无关紧要)。
非常长的 运行ning 事务的更严重后果之一:它阻止 VACUUM
完成它的工作,因为仍然有一个旧事务可以看到旧行。系统会开始膨胀。
特别是,SELECT
在所有引用的表上获取 ACCESS SHARE
锁(阻塞最少)。这不会干扰其他 DML 命令,如 INSERT
、UPDATE
或 DELETE
,但它会 阻止 DDL 命令 以及 TRUNCATE
或 VACUUM
(包括 autovacuum 作业)。 See "Table-level Locks" in the manual.
它还会干扰各种 复制 解决方案并导致 transaction ID wraparound in the long 运行 if it stay打开足够长的时间/你足够快地刻录足够多的 XID。更多关于 in the manual on "Routine Vacuuming".
如果其他事务被阻止提交并且那些事务已经获得了自己的锁,则阻塞效应会迅速发展。等等
您可以(几乎)无限期地保持事务打开 - 直到连接关闭(显然,这也会在服务器重新启动时发生。)
但永远不要让交易打开的时间超过需要的时间。