基本事务语法

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;      -- 回滚事务,不保存任何修改

自动提交与手动事务

保存点 (SAVEPOINT)

在一个事务内部,可以设置保存点,方便部分回滚。

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;

隔离级别 (Isolation Levels)

PostgreSQL 支持标准 SQL 的四种隔离级别:

设置事务隔离级别:

BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ;
  -- 查询和更新
COMMIT;