【问题标题】:Idle in transaction and lock with PostgreSQL事务空闲并使用 PostgreSQL 锁定
【发布时间】:2013-11-02 14:00:30
【问题描述】:

我有一个被锁定的查询。因此我的网络应用程序被锁定了,我真的不明白为什么。

查看 PgAdmin 我有这个:

如果我理解正确,橙色查询已被上面的查询(处于“空闲事务”状态)阻止。

这是否意味着“事务中的空闲”事务未提交? 是不是因为没有提交其他事务被锁定?

如果我提交了“idle in transaction”事务,它会解锁被锁定的事务吗?

说实话,我真的不明白我应该如何解释这一点。你能帮帮我吗?

【问题讨论】:

    标签: sql postgresql transactions


    【解决方案1】:

    你的假设是正确的。 “事务中的空闲”表示会话(在本例中为 PID=16686)启动了一个事务并持有goodscontract 表上的一些锁。

    请注意,您看到的 PID=16686 的选择很可能不是阻止更新的语句(写入程序不会被 Postgres 中的读取程序阻止)。很可能 PID=16686 之前运行了一条不同的语句来获取锁(或者选择包含 for update 子句 - 因为您的屏幕截图没有显示完整的语句,这是不可能的)。

    一般来说,强烈建议尽快结束事务(使用commitrollback) - 其中包括只执行selects 的只读事务。

    【讨论】:

    • 感谢您的回答。实际上我正在使用 Play Framwork(它使用 Hibernate)。据我所知,play 框架在 HTTP 请求的开头打开一个事务并在最后提交它。但在我的情况下,被阻止的事务是我手动打开的无状态事务。另外,您的权利,在空闲事务中,goodscontract 表上有一个先前的更新请求。所有这一切意味着我应该在打开无状态事务之前手动处理事务以提交它们?
    【解决方案2】:

    需要在 postgresql.conf 上更新两件事

    idle_transaction_timeout

    共享内存

    会解决问题的。

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-07
    • 2015-05-16
    • 1970-01-01
    • 2013-08-28
    • 2016-12-22
    • 1970-01-01
    相关资源
    最近更新 更多