PostgreSQL - 回滚 (Rollback)
PostgreSQL - ROLLBACK 命令
Section titled “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 的实际场景
Section titled “使用 ROLLBACK 的实际场景”想象一下两个银行账户之间的资金转账。这个过程需要两个步骤:从发送方账户扣款,然后将款项存入接收方账户。这两个步骤都必须成功。如果扣款成功后,存款操作失败,那么 ROLLBACK 对于撤销扣款至关重要,以确保资金不丢失。
使用 ROLLBACK 的主要好处
Section titled “使用 ROLLBACK 的主要好处”- 防止错误:如果事务中的任何语句失败,
ROLLBACK会丢弃所有先前的更改,防止数据损坏。 - 数据完整性:确保只有完整且有效的事务才保存到数据库中,从而保持数据一致性。
- 安全测试:开发人员可以在事务中执行一系列更改,检查结果,然后使用
ROLLBACK丢弃这些更改,而不会永久性地修改数据库。 - 故障恢复:如果应用程序或数据库服务器在事务执行过程中崩溃,PostgreSQL 会在重启时自动回滚任何未提交的事务。
ROLLBACK 的工作原理:分步示例
Section titled “ROLLBACK 的工作原理:分步示例”让我们通过一个实际示例来演示 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 语句将在表中显示 AliceSELECT * FROM employees WHERE id = 6;
-- 步骤 4:现在,决定撤销操作ROLLBACK;执行 ROLLBACK 后,INSERT 操作将被完全撤销。如果我们再次检查表,新员工将不会出现在其中。
-- 验证事务已回滚SELECT * FROM employees;输出将显示原始表内容,其中不包含“Alice”的记录,这证明 ROLLBACK 成功了。
常见错误与调试
Section titled “常见错误与调试”- 忘记
BEGIN:如果你在没有先用BEGIN启动事务的情况下执行INSERT、UPDATE或DELETE语句,它们将被自动提交,无法回滚。 - 意外
COMMIT:当你打算ROLLBACK时,请务必小心,不要发出COMMIT命令。 - 连接丢失:如果你的数据库连接丢失,PostgreSQL 会自动回滚任何打开的事务。