错误:当前事务被中止,命令被忽略,直到事务块结束 SQL 状态:25P02

Qoh*_*let 4 postgresql transaction

我试图在我的 postgreSQL 数据库中创建一个死锁,但我得到的错误并不是我所期望的:

ERROR:  current transaction is aborted, commands ignored until end of transaction block
SQL state: 25P02
Run Code Online (Sandbox Code Playgroud)

我的设置基本上是这两者的混合:

我打开了 pgAdmin 4 的两个浏览器窗口,并有两个查询窗口。具有以下内容之一:

BEGIN;
    UPDATE "Products"
        SET "Price" = "Price" * 0.03
        WHERE "PID" = 1
        RETURNING *;
        
    UPDATE "Products"
        SET "Price" = "Price" * 0.03 
        WHERE "PID" = 2
        RETURNING *;
COMMIT;     
Run Code Online (Sandbox Code Playgroud)

另一种是使用这个:

BEGIN;
    UPDATE "Products"
        SET "Price" = "Price" * 3
        WHERE "PID" = 2
        RETURNING *;
        
    UPDATE "Products"
        SET "Price" = "Price" * 0.03 
        WHERE "PID" = 1
        RETURNING *;
COMMIT;
Run Code Online (Sandbox Code Playgroud)

我的目的是使两者尽可能接近地执行,但我得到了这个错误。奇怪的是,即使我只是尝试单独运行它们,同样的错误仍然存​​在。我无法理解该错误代码。会是什么呢?

该表本身非常基本:

CREATE TABLE IF NOT EXISTS "Products"
(
    "PID" integer NOT NULL,
    "Name" character varying(255),
    "Price" double precision,
    "Stock" integer,
    CONSTRAINT "Products_pkey" PRIMARY KEY ("PID")
)
Run Code Online (Sandbox Code Playgroud)

我在网上找到的答案并不是特别有帮助。就像这里的这个:

This log event happens when a transaction fails due to a potentially unrelated error, and you try to run another query in the failed transaction.
Run Code Online (Sandbox Code Playgroud)

所以我尝试简单地做:

BEGIN;
    Select "Price" from "Products"
COMMIT;
Run Code Online (Sandbox Code Playgroud)

并收到相同的错误。没有交易块它也能工作

Dan*_*ité 12

当先前的查询失败并且客户端仍在该事务中发出查询时,会发生此错误。在该状态下唯一要做的就是ROLLBACK.

它与死锁或什至有两个并发会话没有特别的关系。

示例psql

test=> begin;
BEGIN

test=*> select 1/0;
ERROR:  division by zero

test=!> select 2;
ERROR:  current transaction is aborted, commands ignored until end of transaction block

test=!> 
Run Code Online (Sandbox Code Playgroud)

在使用 pgAdmin 进行的测试中,您想要一一提交查询。不要将整个 BEGIN......COMMIT 块作为一个整体提交。想必这就是您看不到死锁错误的原因:它立即被下一个查询的错误替换。