【问题标题】:Postresql SQL State: 25P02 Deadlock?Postgresql SQL 状态:25P02 死锁?
【发布时间】:2019-10-07 15:07:22
【问题描述】:

我的任务是用两个 SQL 事务创建一个死锁。我在 PgAdmin 工作。 任务说: "创建两个可以执行的SQL事务 以交互方式(在 cmets 中注释事务应该交错的顺序)到 造成死锁并解释死锁的原因。” 我尝试创建它并在线阅读它,但这是我在尝试使两个进程同时运行而没有 COMMIT/ROLLBACK 时遇到的唯一错误。 我收到此错误消息:

    ERROR:  current transaction is aborted, commands ignored until end of transaction block
    SQL state: 25P02

如果这不是死锁,你能帮我做一个吗?

http://zarez.net/?p=1069

    CREATE TABLE deadlock_example_table_1 (column1 int)

    CREATE TABLE deadlock_example_table_2 (column1 int)

    INSERT INTO deadlock_example_table_1 (column1)
    SELECT 1
    UNION ALL
    SELECT 2
    UNION ALL
    SELECT 3
    GO

    INSERT INTO deadlock_example_table_2 (column1)
    SELECT 1
    UNION ALL
    SELECT 2
    UNION ALL
    SELECT 3
    GO

    BEGIN;
    DELETE FROM deadlock_example_table_1 WHERE column1 = 2

    BEGIN;
    DELETE FROM deadlock_example_table_2 WHERE column1 = 2

https://medium.com/@clairesimmonds/postgresql-decoding-deadlocks-183e6a792fd3 我在想输出应该类似于本文中的内容。

    ERROR: deadlock detected
    DETAIL:  Process 16121 waits for AccessExclusiveLock on relation 17389 of database 16390; blocked by process 15866.
    Process 15866 waits for AccessShareLock on relation 17309 of database 16390; blocked by process 16121.
    HINT:  See server log for query details.

【问题讨论】:

  • 更简单的方法是使用进程 1 插入 2 行,然后使用进程 2 更新这两行,不提交也不回滚,然后使用进程 3 以相反的顺序更新相同的行,进程 3 的第二次更新应该死锁你
  • 你能把它打出来吗? @Gar

标签: sql postgresql transactions deadlock database-deadlocks


【解决方案1】:

第 1 步:填充

INSERT INTO deadlock_example_table_1 (column1)
    SELECT 1
    UNION ALL
    SELECT 2
    UNION ALL
    SELECT 3
go
commit;

第2步:流程2,更新

 update deadlock_example_table_1 set columns1=5 where column1=1;

第 3 步:进程 3(另一个命令窗口)更新

 update deadlock_example_table_1 set columns1=7 where column1=2;
 update deadlock_example_table_1 set columns1=4 where column1=1;

这通常应该被锁定

第四步:返回流程二

 update deadlock_example_table_1 set columns1=80 where column1=2;

这里是死锁

进程 2 和进程 3 应该在不同的会话中

【讨论】:

  • update deadlock_example_table_1 set column1=5 where column1=1 GO 我在“GO”处或附近遇到语法错误
  • 抱歉,已修复
  • 如果这回答了你,请不要犹豫,接受这个问题作为答案。
  • 这里有一些注意事项:1:不要忘记在 INSERT 之后提交,2:使用两个不同的命令窗口(一个用于进程 2,一个用于进程 3),如果您在运行它时仍然遇到问题,请通过聊天系统联系我
【解决方案2】:

必须同时执行。 打开两个窗口并执行以下操作: Process

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多