【发布时间】: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
如果这不是死锁,你能帮我做一个吗?
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