PostgreSQL/ACID
外观
在ACID 范式是数据库管理系统的基石。 对于数据修改,该范式要求事务必须满足某些要求,并且必须保证这些要求不仅在常规操作期间满足,而且在所有轻微和重大问题(如互锁、连接丢失、服务器宕机、磁盘已满、磁盘崩溃等)的情况下也得到满足。
请特别注意,这些要求是在事务级别上定义的。 它们被命名为
- 原子性
- 一致性
- 隔离性
- 持久性
如上一章所示,每个写入操作或一系列写入操作都嵌入到一个事务中。 读取操作也可能是事务的一部分。
事务中的所有写入操作都创建一个单一的、不可分割的整体。 它们要么全部成功,要么全部失败。 针对不同表的写入操作就是这种情况的一个例子。 另一个例子是在转账过程中,一个人的银行账户减少,另一个人的银行账户增加。
在事务结束时,数据库处于一致状态。 所有定义的完整性规则,如唯一性、检查约束、外键和主键定义都得到满足。 此外,所有相关触发器都已成功执行。 在事务的生命周期中,这些规则可能会被破坏,例如,在双向链表中,两个节点之间的外键关系可能会被破坏。
本质上,事务将数据库从一种一致状态转移到另一种一致状态。
在很多情况下,事务会并行运行。 但是数据库系统会让它们觉得它们是按顺序执行的。 根据所选的隔离级别,竞争的读写操作的确切行为可能会有所不同。 尽管如此,PostgreSQL 在所有情况下都能保证,读操作永远不会阻塞写操作,写操作永远不会阻塞读操作。
持久性保证,在事务成功终止(COMMIT)之后,即使发生磁盘崩溃等重大问题,所进行的更改也会保留在数据库中。 PostgreSQL 通过将数据更改不仅保存在数据文件中,而且还冗余地保存在预写日志 (WAL) 文件中来实现这一点。 因此,建议将数据文件和 WAL 文件存储在不同的磁盘上。