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
相关产品推荐
相关产品推荐

