我的任务是用两个 SQL 事务创建死锁。我在 PgAdmin 工作。 任务说: "创建两个可以执行的SQL事务 交互地(在评论中注释交易应该交错的顺序)到 制造僵局并解释僵局的原因。” 我尝试创建它并在线阅读它,但这是我在没有 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.
最佳答案
第一步:填充
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;
这通常应该被锁定
第四步:回到流程2
update deadlock_example_table_1 set columns1=80 where column1=2;
此处死锁
进程 2 和进程 3 应该在不同的 session 上
关于sql - Postgresql SQL 状态 : 25P02 Deadlock?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56234595/