📜  PostgreSQL – 事务(1)

📅  最后修改于: 2023-12-03 15:03:49.479000             🧑  作者: Mango

PostgreSQL – 事务

PostgreSQL 是一款免费,开源的关系型数据库管理系统(RDBMS),它支持高并发和事务处理。在本文中,我们将了解 PostgreSQL 的事务及其实现方式。

什么是事务

事务(Transaction)是指一系列操作对数据库的更改组成的逻辑工作单元,这些操作要么全部执行完毕,要么全部不执行。在 PostgreSQL 中,每个事务都可以包含多个 DML(数据操作语言)操作,例如 INSERT、UPDATE 和 DELETE。

如果事务中的一个操作失败,整个事务将被回滚,即数据库将撤销所有已修改的数据,并返回到事务开始之前的状态。

实现事务

PostgreSQL 实现事务的方式如下:

ACID

PostgreSQL 实现了 ACID 属性。ACID 是数据库事务的四个特性:

  • 原子性(Atomicity):事务被视为一个原子操作单元,如果一部分操作失败,则整个事务将回滚到原始状态。
  • 一致性(Consistency):在一个事务中,如果更改了数据库,它必须保持在一个一致的状态。
  • 隔离性(Isolation):事务必须是对其他事务隔离的,以防止并发问题,例如读取未提交的数据或丢失的更新。
  • 持久性(Durability):一旦事务成功完成,更改将长时间存储在数据库中,并且不会被回滚。
事务控制语句

PostgreSQL 提供了 SQL 事务控制语句 BEGIN、COMMIT 和 ROLLBACK 以实现事务控制。

  • BEGIN:开始一个事务,即将逻辑操作成为一个独立的操作单元。
  • COMMIT:提交事务,如果没有错误发生,则将所有更改推送到数据库。
  • ROLLBACK:回滚事务,撤销当前事务的所有未提交更改。
隔离级别

PostgreSQL 实现了四种可选的事务隔离级别,它们定义了同一时刻并发事务之间的交互。

  • READ UNCOMMITTED:事务可以看到其他未提交的事务所做的更改。
  • READ COMMITTED(PostgreSQL 默认隔离级别):事务只能看到提交的更改。
  • REPEATABLE READ:事务相对隔离,即对于查询结果集的每个扫描,事务都将返回相同的结果集并防止读取未提交的行。
  • SERIALIZABLE:事务是完全隔离的,每个事务之间的更改是不可重复的,并发事务不会互相干扰。
Savepoints

Savepoints 允许在事务内创建子事务,以便在子事务中执行一些操作并在失败时回滚子事务而不是整个事务。

例子

以下代码演示 PostgreSQL 中的事务:

-- Start a transaction
BEGIN;

-- Make some changes to the database
UPDATE employees SET salary = salary * 1.05 WHERE department = 'IT';

-- Check whether changes are correct
SELECT * FROM employees WHERE department = 'IT';

-- Check the number of rows affected by the transaction
SELECT FOUND;

-- Rollback the transaction
ROLLBACK;
结论

PostgreSQL 提供了强大的事务支持,保证了在高并发情况下每个事务的数据完整性和一致性。这些功能对于处理关键业务数据非常重要。在开始使用 PostgreSQL 时,我们应该学习如何使用它的事务以及如何保证数据的完整性和一致性。