【问题标题】:UPDATE statement hangs because of locksUPDATE 语句由于锁而挂起
【发布时间】:2018-03-14 08:20:56
【问题描述】:

我使用 /i blah.pgsql 脚本运行了我的 .pgsql 脚本,然后使用我的 .java 函数调用该 pgsql 来测试它。

但是,在我运行它之后。我意识到它损坏了我的数据,我不确定如何调试以及导致数据损坏的原因。我不能 DROP SCHEMA 因为它挂起,所以我必须创建一个新的 SHOW SEARCH_PATH Schema 来再次测试它。我已经做了三遍了,我想避免这个问题。有人可以帮我确定导致数据损坏的原因吗?谢谢!老实说,这是我唯一的问题,我无法弄清楚为什么这会导致数据库损坏。如果您需要更多信息/数据库,请告诉我,以便我进行编辑并提供更多信息。

创建此文件的目的是获取每次更新的计数。 但似乎更新正在破坏整个数据库文件

这是我的代码

CREATE OR REPLACE function assignDelinquents (theAgent char(6), theCount integer)
RETURNS integer
LANGUAGE plpgsql
AS $$
DECLARE
max_update integer := 0;
counter integer := 0;

BEGIN

  LOOP
    UPDATE Delinquents d
    -- code here 

    counter := counter + 1;

    END LOOP;

   RETURN counter;

END $$;

编辑:pg_stat_activity 结果:https://pastebin.com/46hN1uj9 我对 pgsql 还很陌生,所以我真的什么都做不了,这真的很奇怪。

【问题讨论】:

  • “损坏的数据”到底是什么意思?您收到的错误信息是什么?
  • 为什么您认为它已损坏?从您的描述来看,它看起来更像是锁定的资源。 pg_stat_activity 中有什么内容?..
  • @Vao Tsun 它只是挂起。当我尝试放弃该计划时,什么也没有发生。它仍然无限运行。这是 pg_stat_activity pastebin.com/46hN1uj9
  • 是的 - 你有 wait_event 不为空。运行wiki.postgresql.org/wiki/Lock_Monitoring 以获取阻止程序 - 并终止它或等待完成或超时...
  • 有趣,你知道它为什么会锁吗??我将如何终止阻止程序/超时?

标签: sql postgresql sql-update locks


【解决方案1】:

没有数据库损坏,一切都很好。

如果您查看pg_stat_activity 输出,说明很简单。

  • 您在 2018-03-13 23:05:37.362666-07 开始

    SELECT * FROM assignDelinquents($1,$2)
    

    它仍在运行(因此它已经运行了超过 1.5 小时)。
    这并不奇怪,因为该函数包含一个无限循环。

  • 您在 2018-03-13 23:55:33.097579-07 开始

    DROP SCHEMA Lab4 CASCADE;
    

    它试图在架构中的所有表上获得ACCESS EXCLUSIVE 锁定,但显然其中一些表已被您长时间运行的查询使用,因此该语句被阻止。

  • 尝试使用架构中已被前一个语句锁定的表的所有后续语句也必须等待。

解决方案是终止长时间运行的查询(并修复您的函数)。

SELECT pg_terminate_backend(8838);

【讨论】:

  • 其实找到了原因,我只是进入了一个无限循环(没有声明)。我设置了一个while循环条件并且它起作用了。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-06
  • 1970-01-01
  • 1970-01-01
  • 2013-01-12
  • 1970-01-01
  • 2016-09-29
  • 2021-07-09
相关资源
最近更新 更多