sql - UPDATE 语句因锁定而挂起

标签 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 的新手,所以我什么都做不了真的很奇怪。

最佳答案

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

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

关于sql - UPDATE 语句因锁定而挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49272719/

相关文章:

mysql - 更新主键 - 如果重复,则将其删除

java - 安卓| SQLite : Pre-created database updating without using SQLiteOpenHelper

php - 更新特定列等于其他表

PHP Mysql - 导出整个数据库

sql - 建立审计制度; SQL Server 后端上的 MS Access 前端

database - 是否有可能获得在 postgres 中进行的查询的历史记录

java - Hibernate查询转Sql查询

sql - 转换日期 postgreSQL 时出错

sql - 带有 "other"选项的复选框的最佳 SQL 模式

mysql - SQL - 使用另一个表的结果插入或更新