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 块作为一个整体提交。想必这就是您看不到死锁错误的原因:它立即被下一个查询的错误替换。
归档时间: |
|
查看次数: |
53520 次 |
最近记录: |