由于锁

时间:2018-03-14 08:20:57

标签: sql postgresql sql-update locks

我使用/ 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很新,所以我真的不能做任何事情真的很奇怪。

1 个答案:

答案 0 :(得分:0)

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

如果查看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);