📚 目录

  1. 概述
  2. 事务的基本语法
  3. 事务的工作原理
  4. 事务的四个特性(ACID)
  5. 事务的控制命令
  6. 事务的使用示例
  7. 参考资料

🛠️ 概述

在 PostgreSQL 中,事务(TRANSACTION) 是一组操作的集合,它们作为一个单独的单位执行,要么全部成功,要么全部失败。事务确保数据库的完整性和一致性,避免了在多操作过程中发生部分提交的情况。事务常用于需要确保数据一致性的操作,如银行转账等。

通过使用事务,可以将多个 SQL 语句作为一个整体执行,以保证在出错时可以回滚到事务开始前的状态,防止部分数据被修改而导致数据不一致。


📝 事务的基本语法

PostgreSQL 提供了几个关键命令来管理事务:

  1. BEGIN:开始事务
  2. COMMIT:提交事务
  3. ROLLBACK:回滚事务

语法:

BEGIN;  -- 开始事务
-- 一系列 SQL 操作
COMMIT;  -- 提交事务

或者,如果在事务过程中发生错误并希望撤销所有操作:

BEGIN;  -- 开始事务
-- 一系列 SQL 操作
ROLLBACK;  -- 回滚事务


📝 事务的工作原理

事务的工作原理是通过以下步骤实现的:

  1. 开始事务:执行 BEGIN 命令,开始事务处理。
  2. 执行 SQL 操作:在事务中,可以执行一系列的数据操作(如 INSERTUPDATEDELETE)。
  3. 提交事务:使用 COMMIT 命令提交所有操作,所有变更将永久保存。
  4. 回滚事务:如果在事务中出现错误,使用 ROLLBACK 命令撤销所有已执行的操作,将数据库恢复到事务开始之前的状态。

📝 事务的四个特性(ACID)

事务的管理遵循 ACID 原则,确保数据的一致性和可靠性:

  1. 原子性(Atomicity): 事务中的所有操作要么全部成功,要么全部失败,不能只执行其中的一部分。
  2. 一致性(Consistency): 事务开始前和结束后,数据库必须处于一致的状态。即事务中的操作必须使数据库的状态从一个一致的状态转变为另一个一致的状态。
  3. 隔离性(Isolation): 事务的执行不应受其他事务的干扰。不同事务之间的操作是隔离的。即使多个事务并发执行,它们不会相互影响,数据库的状态也不会变得不一致。
  4. 持久性(Durability): 一旦事务提交,对数据库的修改是永久性的,即使系统崩溃,数据也不会丢失。

📝 事务的控制命令

  • BEGIN:启动一个新的事务。 BEGIN;
  • COMMIT:提交当前事务,使所有的更改生效。 COMMIT;
  • ROLLBACK:撤销当前事务,所有已执行的操作都将回滚。 ROLLBACK;
  • SAVEPOINT:在事务中设置一个保存点。保存点允许你回滚到特定的点,而不是整个事务。 SAVEPOINT savepoint_name;
  • RELEASE SAVEPOINT:删除一个保存点。 RELEASE SAVEPOINT savepoint_name;
  • ROLLBACK TO SAVEPOINT:回滚到指定的保存点。 ROLLBACK TO SAVEPOINT savepoint_name;

📝 事务的使用示例

示例 1:基本事务

假设我们有两个账户表 account1account2,需要将 account1 的资金转移到 account2

BEGIN;

UPDATE account1 SET balance = balance - 100 WHERE account_id = 1;
UPDATE account2 SET balance = balance + 100 WHERE account_id = 2;

COMMIT;

在此示例中,两个 UPDATE 操作被包装在一个事务中,确保要么两者都成功,要么两者都不成功。

示例 2:事务回滚

如果在事务中发生错误,可以使用 ROLLBACK 来撤销所有操作。例如:

BEGIN;

UPDATE account1 SET balance = balance - 100 WHERE account_id = 1;
UPDATE account2 SET balance = balance + 100 WHERE account_id = 2;

-- 假设在执行第二个 UPDATE 时发生错误
ROLLBACK;

此时,所有在事务中的变更都被撤销,账户余额没有发生变化。

示例 3:使用 SAVEPOINT

在一个事务中,可以使用 SAVEPOINT 来标记一个特定的点,并在出现问题时回滚到该点:

BEGIN;

UPDATE account1 SET balance = balance - 100 WHERE account_id = 1;

SAVEPOINT savepoint1;  -- 创建保存点

UPDATE account2 SET balance = balance + 100 WHERE account_id = 2;

-- 假设第二个 UPDATE 发生错误
ROLLBACK TO SAVEPOINT savepoint1;  -- 回滚到保存点

COMMIT;


📘 参考资料