数据库中的ACID

214 阅读3分钟

ACID

ACID 代表Atomicity(原子性)、Consistency(一致性)、Isolation(隔离性)和Durability(持久性),已经成为定义数据库系统中最高级别事务完整性的黄金标准。

Atomicity(原子性)

事务操作要么完全成功,要么完全失败。

这两个状况之间不一致的任何事情都是不能接受的。

说明这个属性的典型例子是将资金从一个账户(比如说 A)转移到另一个账户(比如说 B)。如果需要将100美元从 A 转移到 B,则需要将100美元从 A 借记(取出)并贷记(存入) B。这可能从逻辑上意味着操作涉及两个步骤: 从 A 借记和贷记到 B 原子性意味着,如果由于某种原因,从 A 借记成功,然后操作失败,整个操作回滚,操作不留在一个不一致的状态(其中的钱已经从 A 借记,但没有贷记到 B)。

Consistency(一致性)

一致性意味着,如果数据违反了预定义的约束或规则,它就不会被持久化。

例如,如果某个特定字段声明它应该只包含整数值,则不接受浮点值,或者将其四舍五入为最接近的整数,然后保存。一致性常常与原子性混淆。

此外,它在 RDBMS 上下文中的含义通常与独特的约束,数据类型验证和引用完整性有关。在更大的应用场景中,一致性可能包括施加在数据上的更复杂的规则,但在这种情况下,维护一致性的任务主要留给应用程序。

Isolation(隔离性)

隔离与数据相关并发访问。

如果两个独立的进程或线程操纵相同的数据集,则可能导致数据库被锁。

例如,考虑两个进程,X 和 Y,修改字段 V 的值,该字段保存初始值 VO。假设 X 读取值VO 并且希望将值更新到 V1但是在 V1之前它完成更新 Y 读取值 VO 和升级到 V2。现在,当 X 想要写入值 V1时,它会发现原始值已被更新。在不受控制的情况下,X 会覆盖 Y 已经写入的新值,这可能是不可取的。

请看下图,以图形方式查看陈述的用例。

image.png

隔离可以避免这种差异。

Durability(持久性)

耐久性意味着一旦事务操作得到确认,它就是有保证的。

耐久性受到质疑的情况是客户端程序已收到事务操作成功的确认信息,但随后系统故障使数据无法保存到存储区。

RDBMS 通常维护事务日志。

事务只有在写入事务日志之后才能确认。如果系统在确认和数据持久性之间发生故障,事务日志将与持久性存储同步,以使其处于一致状态。


ACID 担保在关系型数据库管理系统中得到了广泛的认可和期望。

通常,使用 RDBMS 的应用程序框架和语言试图将 ACID 承诺扩展到整个应用程序。

如果整个堆栈(即数据库和应用程序)驻留在单个服务器或节点上,但是当堆栈成分分布到多个节点时,堆栈就开始被拉长,那么这种情况就可以很好地工作。


本文正在参加「金石计划 . 瓜分6万现金大奖」