跳转到内容

PostgreSQL/ACID

来自 Wikibooks,开放世界的开放书籍


ACID 范式是数据库管理系统的基石。 对于数据修改,该范式要求事务必须满足某些要求,并且必须保证这些要求不仅在常规操作期间满足,而且在所有轻微和重大问题(如互锁、连接丢失、服务器宕机、磁盘已满、磁盘崩溃等)的情况下也得到满足。

请特别注意,这些要求是在事务级别上定义的。 它们被命名为

  • 原子性
  • 一致性
  • 隔离性
  • 持久性

如上一章所示,每个写入操作或一系列写入操作都嵌入到一个事务中。 读取操作也可能是事务的一部分。

原子性

[编辑 | 编辑源代码]

事务中的所有写入操作都创建一个单一的、不可分割的整体。 它们要么全部成功,要么全部失败。 针对不同表的写入操作就是这种情况的一个例子。 另一个例子是在转账过程中,一个人的银行账户减少,另一个人的银行账户增加。

一致性

[编辑 | 编辑源代码]

在事务结束时,数据库处于一致状态。 所有定义的完整性规则,如唯一性、检查约束、外键和主键定义都得到满足。 此外,所有相关触发器都已成功执行。 在事务的生命周期中,这些规则可能会被破坏,例如,在双向链表中,两个节点之间的外键关系可能会被破坏。

本质上,事务将数据库从一种一致状态转移到另一种一致状态。

隔离性

[编辑 | 编辑源代码]

在很多情况下,事务会并行运行。 但是数据库系统会让它们觉得它们是按顺序执行的。 根据所选的隔离级别,竞争的读写操作的确切行为可能会有所不同。 尽管如此,PostgreSQL 在所有情况下都能保证,读操作永远不会阻塞写操作,写操作永远不会阻塞读操作。

持久性

[编辑 | 编辑源代码]

持久性保证,在事务成功终止(COMMIT)之后,即使发生磁盘崩溃等重大问题,所进行的更改也会保留在数据库中。 PostgreSQL 通过将数据更改不仅保存在数据文件中,而且还冗余地保存在预写日志 (WAL) 文件中来实现这一点。 因此,建议将数据文件和 WAL 文件存储在不同的磁盘上。


华夏公益教科书