ACID 是指数据库管理系统(DBMS)在写入或更新资料的过程中,为保证事务(transaction)是正确可靠的,所必须具备的四个特性:原子性(atomicity,或称不可分割性)、一致性(consistency)、隔离性(isolation,又称独立性)、持久性(durability)。
原子性 (Atomicity)
一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。即,事务不可分割、不可约简。
一致性 (Consistency)
-
一种说法
ACID 里的 AID 都是数据库的特征,也就是依赖数据库的具体实现。而唯独这个 C,实际上它依赖于应用层,也就是依赖于开发者。这里的一致性是指系统从一个正确的状态,迁移到另一个正确的状态。什么叫正确的状态呢?就是当前的状态满足预定的约束就叫做正确的状态。而事务具备 ACID 里 C 的特性是说通过事务的 AID 来保证我们的一致性。
举个例子:
A 要向 B 支付 100 元,而 A 的账户中只有 90 元,并且我们给定账户余额这一列的约束是,不能小于 0。那么很明显这条事务执行会失败,因为 90-100=-10,小于我们给定的约束了。
这个例子里,支付之前我们数据库里的数据都是符合约束的,但是如果事务执行成功了,我们的数据库数据就破坏约束了,因此事务不能成功,这里我们说事务提供了一致性的保证。然后我们再看个例子:
A 要向 B 支付 100 元,而 A 的账户中只有 90 元,我们的账户余额列没有任何约束。但是我们业务上不允许账户余额小于 0。因此支付完成后我们会检查 A 的账户余额,发现余额小于 0 了,于是我们进行了事务的回滚。
这个例子里,如果事务执行成功,虽然没有破坏数据库的约束,但是破坏了我们应用层的约束。而事务的回滚保证了我们的约束,因此也可以说事务提供了一致性保证(事实上,是我们应用层利用事务回滚保证了我们的约束不被破坏)。最后我们再看个例子:
A 要向 B 支付 100 元,而 A 的账户中只有 90 元,我们的账户余额列没有任何约束。然后支付成功了。
这里,如果按照很多人的理解,事务不是保证一致性么?直观上账户余额为什么能为负呢。但这里事务执行前和执行后,我们的系统没有任何的约束被破坏。一直都是保持正确的状态。
所以,综上。你可以理解一致性就是:应用系统从一个正确的状态到另一个正确的状态。而 ACID 就是说事务能够通过 AID 来保证这个 C 的过程。C 是目的,AID 都是手段。
-
另一种说法
在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设约束、触发器、级联回滚等。比如如果一个字段添加了非空约束,那么在尝试给该字段设置空数据时,会导致数据库的不一致状态,此时整个事务就应该回滚,以保证数据库的一致性。
隔离性 (Isolation)
数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括未提交读(Read uncommitted)、提交读(read committed)、可重复读(repeatable read)和串行化(Serializable)。
持久性 (Durability)
事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
参考:
ACID - 维基百科,自由的百科全书
如何理解数据库事务中的一致性的概念?
acid - database atomicity consistency