You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL含隔离级别事务编写报错(SQL状态25P02)求助

问题排查:事务执行报错(SQL状态25P02)

背景信息

用户创建的表结构及测试数据如下:

DROP TABLE IF EXISTS Sellers, Products, Sales;

CREATE TABLE Sellers (
    SID INT PRIMARY KEY, 
    Name VARCHAR(256), 
    Profit DECIMAL(10, 2)
);

CREATE TABLE Products (
    PID INT PRIMARY KEY, 
    Name VARCHAR(256), 
    Price DECIMAL(10, 2), 
    Stock INT
);

CREATE TABLE Sales (
    SDate DATE, 
    SID INT REFERENCES Sellers(SID),
    PID INT REFERENCES Products(PID),
    PRIMARY KEY (SID, PID),
    Quantity INT
);

INSERT INTO Sellers (SID, Name, Profit) VALUES (9, 'S1', 0.0);

INSERT INTO Products (PID, Name, Price, Stock) VALUES (1, 'P1', 25, 100);

编写的事务代码:

START TRANSACTION ISOLATION LEVEL READ COMMITTED;
UPDATE Sales SET Quantity = 10, SDate = '2022-04-07' WHERE (SID,PID) = (1,1);
UPDATE Product SET Stock = Stock - 10 WHERE PID = 1;
UPDATE Seller SET Profit = Profit + 250 WHERE SID = 1;
COMMIT TRANSACTION

执行时出现错误:当前事务已取消,事务结束前的命令被忽略(SQL状态25P02)


错误原因分析

  • 表名拼写错误:事务中使用了Product和Seller,但实际创建的表是复数形式的Products和Sellers。数据库找不到对应表,触发错误导致事务直接取消。
  • Sales表无匹配记录:当前Sales表为空,且Sellers表仅存在SID=9的卖家,没有SID=1的记录,UPDATE Sales WHERE (SID,PID)=(1,1)不会修改任何行,若后续要插入该记录还会违反外键约束。
  • 目标卖家不存在:Sellers表只有SID=9的记录,事务中更新SID=1的卖家利润,既不会修改数据,也不符合业务逻辑预期。

修正后的事务代码

先补充必要的测试数据,再修正表名错误:

-- 补充缺失的测试数据
INSERT INTO Sellers (SID, Name, Profit) VALUES (1, 'S2', 0.0);
INSERT INTO Sales (SID, PID, Quantity, SDate) VALUES (1, 1, 0, '2022-04-01');

-- 修正后的事务
START TRANSACTION ISOLATION LEVEL READ COMMITTED;
UPDATE Sales SET Quantity = 10, SDate = '2022-04-07' WHERE (SID,PID) = (1,1);
UPDATE Products SET Stock = Stock - 10 WHERE PID = 1;
UPDATE Sellers SET Profit = Profit + 250 WHERE SID = 1;
COMMIT TRANSACTION;

内容的提问来源于stack exchange,提问作者3nondatur

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 11:02:43