Skip to content

PostgreSQL - 回滚 (Rollback)

理解 PostgreSQL 中的事务和 ROLLBACK

Section titled “理解 PostgreSQL 中的事务和 ROLLBACK”

在 PostgreSQL 中,事务是作为单个逻辑工作单元执行的一系列操作。ROLLBACK 命令用于丢弃当前事务中进行的所有更改,有效地撤消它们并将数据库恢复到事务开始之前的状态。

ACID 特性:ROLLBACK 和 COMMIT 的作用

PostgreSQL 中的事务遵循 ACID 特性(原子性、一致性、隔离性、持久性)。ROLLBACK 和 COMMIT 对于强制执行这些特性至关重要。

  • 原子性(Atomicity):确保事务中的所有操作都成功完成。如果任何部分失败,整个事务都将被回滚。COMMIT 确认成功的事务,而 ROLLBACK 在失败时强制执行原子性。
  • 一致性(Consistency):保证事务将数据库从一个有效状态带到另一个有效状态。ROLLBACK 防止违反数据库规则(如约束)的事务被保存。
  • 隔离性(Isolation):确保并发事务不会相互干扰。这由 PostgreSQL 的并发控制系统管理。
  • 持久性(Durability):一旦事务通过 COMMIT 提交,其更改就是永久性的,并且在系统故障后仍然存在。ROLLBACK 丢弃非持久性更改。

想象一下两个银行账户之间的资金转账。这个过程需要两个步骤:从发送方账户扣款,然后将款项存入接收方账户。这两个步骤都必须成功。如果扣款成功后,存款操作失败,那么 ROLLBACK 对于撤销扣款至关重要,以确保资金不丢失。

  • 防止错误:如果事务中的任何语句失败,ROLLBACK 会丢弃所有先前的更改,防止数据损坏。
  • 数据完整性:确保只有完整且有效的事务才保存到数据库中,从而保持数据一致性。
  • 安全测试:开发人员可以在事务中执行一系列更改,检查结果,然后使用 ROLLBACK 丢弃这些更改,而不会永久性地修改数据库。
  • 故障恢复:如果应用程序或数据库服务器在事务执行过程中崩溃,PostgreSQL 会在重启时自动回滚任何未提交的事务。

让我们通过一个实际示例来演示 ROLLBACK。我们将尝试向 employees 表添加一名新员工。首先,让我们看看表的当前状态。

-- 假设我们有一个 'employees' 表
-- 检查其当前内容
SELECT * FROM employees;

这将显示现有员工。现在,让我们开始一个事务来添加一名新员工,但随后决定撤销它。

-- 步骤 1:开始一个新事务
BEGIN;
-- 步骤 2:插入一条新的员工记录
INSERT INTO employees (id, name, position, salary, department, hire_date)
VALUES (6, 'Alice', 'Data Scientist', 95000.00, 'Analytics', '2024-05-20');
-- 步骤 3:在同一事务中,你可以看到更改
-- 这个 SELECT 语句将在表中显示 Alice
SELECT * FROM employees WHERE id = 6;
-- 步骤 4:现在,决定撤销操作
ROLLBACK;

执行 ROLLBACK 后,INSERT 操作将被完全撤销。如果我们再次检查表,新员工将不会出现在其中。

-- 验证事务已回滚
SELECT * FROM employees;

输出将显示原始表内容,其中不包含“Alice”的记录,这证明 ROLLBACK 成功了。

  • 忘记 BEGIN:如果你在没有先用 BEGIN 启动事务的情况下执行 INSERT、UPDATE 或 DELETE 语句,它们将被自动提交,无法回滚。
  • 意外 COMMIT:当你打算 ROLLBACK 时,请务必小心,不要发出 COMMIT 命令。
  • 连接丢失:如果你的数据库连接丢失,PostgreSQL 会自动回滚任何打开的事务。