3.4 事务
大约 2 分钟
事务是所有数据库系统的基本概念。
事务的要点是它将多个步骤捆绑到一个全有或全无的操作中。
步骤之间的中间状态对其他并发事务不可见,如果发生阻止事务完成的故障,则任何步骤都不会影响数据库。
事务必须是全有或全无的,不仅要对数据库产生永久影响,还要约束它们发生的可见性。
当多个事务并发运行时,每个事务都不应看到其他事务所做的不完整更改(事务之间不可见)。
在 PostgreSQL 中,事务是通过用 BEGIN 和 COMMIT 命令将事务的 SQL 命令括起来来设置的。所以我们的银行交易实际上看起来像:
BEGIN;
UPDATE accounts SET balance = balance - 100.00
WHERE name = 'Alice';
-- etc etc
COMMIT;
PostgreSQL 实际上将每个 SQL 语句都视为在事务中执行。如果不发出 BEGIN 命令,则每个单独的语句都有一个隐式的 BEGIN 和 COMMIT(如果成功)。由 BEGIN 和 COMMIT 包围的一组语句有时称为事务块。
通过使用 savepoint,可以以更精细的方式控制事务中的语句。Savepoint 允许您有选择地丢弃事务的某些部分,同时提交其余部分。
使用 SAVEPOINT 定义 Savepoint 后,如果需要,可以使用 ROLLBACK TO 回滚到该 Savepoint。
在定义 savepoint 和回滚到它之间的所有事务数据库更改都将被丢弃,但早于 savepoint 的更改将被保留。
BEGIN;
UPDATE accounts SET balance = balance - 100.00
WHERE name = 'Alice';
SAVEPOINT my_savepoint;
UPDATE accounts SET balance = balance + 100.00
WHERE name = 'Bob';
-- oops ... forget that and use Wally's account
ROLLBACK TO my_savepoint;
UPDATE accounts SET balance = balance + 100.00
WHERE name = 'Wally';
COMMIT;
ROLLBACK TO 是重新获得对由于错误而被系统置于 aborted 状态的事务块的控制权的唯一方法,而不是将其完全回滚并重新开始。