BEGIN; -- 开始事务(也可以用 START TRANSACTION)
-- 执行多条 SQL 语句
INSERT INTO accounts(id, balance) VALUES (1, 1000);
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
INSERT INTO logs(action) VALUES ('deduct 100');
COMMIT; -- 提交事务
如果在中途发现错误,可以回滚:
BEGIN;
UPDATE accounts SET balance = balance - 500 WHERE id = 2;
-- 假设余额不足,检测失败
ROLLBACK; -- 回滚事务,不保存任何修改
BEGIN ... COMMIT 包裹。在一个事务内部,可以设置保存点,方便部分回滚。
BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
SAVEPOINT sp1;
UPDATE accounts SET balance = balance - 200 WHERE id = 2;
ROLLBACK TO sp1; -- 撤销第二条 update,但保留第一条
COMMIT;
PostgreSQL 支持标准 SQL 的四种隔离级别:
设置事务隔离级别:
BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ;
-- 查询和更新
COMMIT;