Postgresql 简明教程

PostgreSQL - TRANSACTIONS

事务是对数据库执行的一个工作单元。事务是按照逻辑顺序完成的工作单元或序列,无论是由用户手动完成还是由某种数据库程序自动完成。

事务是将一个或多个更改传播到数据库的过程。例如,创建记录、更新记录、或从表中删除记录,即正在对表进行事务。控制事务以确保数据完整性和处理数据库错误非常重要。

实际上,你会把许多 PostgreSQL 查询组合成一个组,然后一起执行它们作为事务的一部分。

Properties of Transactions

事务具有以下四个标准属性,通常用首字母缩写词 ACID 提到 -

  1. Atomicity − 确保工作单元中的所有操作都成功完成;否则,将在失败点中止事务,并将以前的运算回滚到它们原来的状态。

  2. Consistency − 确保数据库在成功提交事务后正确更改状态。

  3. Isolation − 使得事务能够彼此独立且透明地操作。

  4. Durability − 确保在系统故障的情况下,已提交事务的结果或效果会持续存在。

Transaction Control

以下命令用于控制事务 −

  1. BEGIN TRANSACTION − 开始事务。

  2. COMMIT − 保存更改,或者也可以使用 END TRANSACTION 命令。

  3. ROLLBACK − 回滚更改。

事务控制命令仅用于 DML 命令 INSERT、UPDATE 和 DELETE。它们不能用于创建表或删除表,因为这些操作会自动提交到数据库中。

The BEGIN TRANSACTION Command

可以使用 BEGIN TRANSACTION 或简单的 BEGIN 命令开始事务。此类事务通常会持续到遇到下一个 COMMIT 或 ROLLBACK 命令。但是如果数据库关闭或出现错误,事务也会进行 ROLLBACK。

以下是开始事务的简单语法 −

BEGIN;

or

BEGIN TRANSACTION;

The COMMIT Command

COMMIT 命令是用于将由事务调用的更改保存到数据库的事务命令。

COMMIT 命令将自上一个 COMMIT 或 ROLLBACK 命令以来的所有事务保存到数据库中。

COMMIT 命令的语法如下 −

COMMIT;

or

END TRANSACTION;

The ROLLBACK Command

ROLLBACK 命令是用于撤销尚未保存到数据库的事务的事务命令。

ROLLBACK 命令只能用来撤销自上次发出 COMMIT 或 ROLLBACK 命令以来的事务。

ROLLBACK 命令的语法如下 −

ROLLBACK;

Example

考虑 COMPANY 表有以下记录 −

 id | name  | age | address   | salary
----+-------+-----+-----------+--------
  1 | Paul  |  32 | California|  20000
  2 | Allen |  25 | Texas     |  15000
  3 | Teddy |  23 | Norway    |  20000
  4 | Mark  |  25 | Rich-Mond |  65000
  5 | David |  27 | Texas     |  85000
  6 | Kim   |  22 | South-Hall|  45000
  7 | James |  24 | Houston   |  10000

现在,我们开始一个事务并从表中删除年龄 = 25 的记录,最后我们使用 ROLLBACK 命令撤消所有更改。

testdb=# BEGIN;
DELETE FROM COMPANY WHERE AGE = 25;
ROLLBACK;

如果您将检查 COMPANY 表,它仍将有以下记录 −

 id | name  | age | address   | salary
----+-------+-----+-----------+--------
  1 | Paul  |  32 | California|  20000
  2 | Allen |  25 | Texas     |  15000
  3 | Teddy |  23 | Norway    |  20000
  4 | Mark  |  25 | Rich-Mond |  65000
  5 | David |  27 | Texas     |  85000
  6 | Kim   |  22 | South-Hall|  45000
  7 | James |  24 | Houston   |  10000

现在,我们开始另一个事务并从表中删除年龄 = 25 的记录,最后我们使用 COMMIT 命令提交所有更改。

testdb=# BEGIN;
DELETE FROM COMPANY WHERE AGE = 25;
COMMIT;

如果您将检查 COMPANY 表,它仍在有以下记录 −

 id | name  | age | address    | salary
----+-------+-----+------------+--------
  1 | Paul  |  32 | California |  20000
  3 | Teddy |  23 | Norway     |  20000
  5 | David |  27 | Texas      |  85000
  6 | Kim   |  22 | South-Hall |  45000
  7 | James |  24 | Houston    |  10000
(5 rows)