提问人:Lapin 提问时间:10/9/2023 更新时间:10/10/2023 访问量:21
如何更正尝试回滚时发生的语法错误?
How to correct the syntax error that occurs when I try to do a rollback?
问:
我正在尝试进行回滚,但我有一个语法错误。我想制作一个交易脚本来处理汇款。你能帮帮我吗?
DROP TABLE clients, accounts, transactions;
CREATE TABLE IF NOT EXISTS clients
(
id int PRIMARY KEY,
name varchar
);
CREATE TABLE IF NOT EXISTS accounts
(
id int PRIMARY KEY,
balance float,
client int,
FOREIGN KEY (client) REFERENCES clients(id),
CHECK (balance >= -500)
);
CREATE TABLE IF NOT EXISTS transactions
(
id int PRIMARY KEY,
payer int,
recipient int,
amount float,
FOREIGN KEY (payer) REFERENCES clients(id),
FOREIGN KEY (recipient) REFERENCES clients(id)
);
INSERT INTO clients VALUES (10, 'Client 1');
INSERT INTO clients VALUES (14, 'Client 2');
INSERT INTO clients VALUES (25, 'Client 3');
INSERT INTO accounts VALUES (2, 300, 10);
INSERT INTO accounts VALUES (8, 2000, 14);
INSERT INTO accounts VALUES (12, 650, 25);
CREATE OR REPLACE FUNCTION update_accounts()
RETURNS TRIGGER AS $$
BEGIN
SAVEPOINT before_transaction;
-- amount from the payer's balance
UPDATE accounts
SET balance = balance - NEW.amount
WHERE client = NEW.payer;
-- amount to the recipient's balance
UPDATE accounts
SET balance = balance + NEW.amount
WHERE client = NEW.recipient;
RETURN NEW;
EXCEPTION
WHEN OTHERS THEN
RAISE NOTICE 'An error occured during the transaction. Each account must have a balance of at least -500.';
ROLLBACK TO before_transaction;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER new_transaction
AFTER INSERT ON transactions
FOR EACH ROW
EXECUTE FUNCTION update_accounts();
INSERT INTO transactions VALUES (1, 10, 14, 1000);
SELECT * FROM accounts;
我尝试使用“ROLLBACK”,但也有一个错误(这不是语法错误,但仍然是一个错误)。
感谢您的帮助!
答:
0赞
Laurenz Albe
10/10/2023
#1
不能在函数中使用事务控制语句,如 和。最简单的解决方案是省略这两个语句,它们在代码中是不必要的。SAVEPOINT
ROLLBACK TO SAVEPOINT
评论
0赞
Lapin
10/10/2023
如果事务失败,我必须进行回滚。
0赞
Laurenz Albe
10/10/2023
如果出现异常,则会自动进行回滚。
评论