ACID 是什么?请解释 ACID 特性
2024年4月1日
在资料库的领域当中,有个必须要知道的名词 ACID,这个词是由四个字所组成,透过这篇文章,我们一起来了解 ACID、讨论 ACID 时有什么思考点。
先聊聊交易 (transaction)
在讲 ACID 之前,要先聊资料库的交易 (transaction)。所谓的资料库交易,可以理解成一系列对资料库的读取和写入操作,而所有的操作都要能正常运行,交易才能提交;如果中间有任何的操作失败,就会要把所有的操作都回滚。
白话一点理解,就是要不就都做,要不然就不做 (all or nothing)。举例来说,如果今天 A 要转帐 $1,000 元给 B,这个交易会含有的操作包含,把 A 的余额减去 1,000,以及把 B 的余额增加 1,000。如果在转帐的过程中,银行系统出问题,导致 A 的余额减少,但是 B 的没增加,那就会变得很棘手,为了避免这种状况,全有或全无的特性就特别重要。
而 ACID 的特性,即是可以用来确保交易都是正确可靠,维护资料的完整性。让我们进一步来了解 ACID 吧。
Atomicity (原子性)
ACID 的 A 是指原子性,所谓的原子性,是指一个交易中的操作,要不全部完成,要不全部失败,这也是我们上面所提到的全有或全无的概念。原子性意味着,如果交易过程中,有任何操作失败,整个交易都需要回滚,让资料库回到交易之前的状态,这也是为什么过去有人会说,可退回性 (abortability) 是原子性的关键。
Consistency (一致性)
ACID 的 C 是指一致性,所谓的一致性代表着,交易开始前与交易开始后,资料库的完整性没有被破坏。从转帐的例子来说,如果原本 A 有 $1,000 元,B 有 $0 元,两人共 $1,000 元,在完成转帐后,总合仍是 $1,000 元,金额是稳定不变的。假如在转完帐后,整个系统的金额变成负的,那就出大问题了,这也是为什么保持一致性非常重要。
Isolation (隔离性)
ACID 的 I 是指隔离性,所谓的隔离性代表着交易之间不会互相干扰,一个交易内部的操作以及使用的资料,对于其他交易是相互隔离的。以转帐的例子来说,A 转帐给 B 这笔交易,跟 C 转帐给 D 的交易彼此没有影响。有隔离性的好处在于,如果有并发的交易,资料库可以防止多个交易并发时交叉执行,导致资料不一致的状况。
如果没有做好隔离,可能会导致读到脏资料 (dirty data),例如假如 A 交易读取了某个 B 还没有提交的交易,该交易把某个用户的名字,从小鹏改成小杰,而 B 因为某些原因要回滚,所以命字变回小鹏,那么 A 读到的小杰,就会是有问题的。
另外,没做好隔离,也会导致假如今天 C 交易还在进行时,D 交易对某个 C 正在更改的资料做读取,重复读取的过程如果 C 交易有改动,那 D 交易前后读到的就会不一致。
Durability (持久性)
ACID 的 D 是指持久性,所谓的持久性意味对于资料的写入是永久了,即使系统故障也不会丢失资料。举例来说,今天你买了一张机票,资料库记录你购买的资讯,不会因为系统故障而丢失。
谈论 ACID 时的思考点
关于 ACID,有几个特别可以拉出来谈的点,包含:
ACID 不是关联资料库独有的
过去谈到 ACID 的特性,多数人会直接联想到关联资料库 (RDBMS),或说 SQL 资料库。确实关联资料库会有 ACID 的特性,但是现在有许多 NoSQL 资料库,也有做到 ACID。
ACID 是种取舍
上面提到 ACID 的特点,以及能带来的好处。然而 ACID 也有显而易见的问题。举例来说,从 CAP 理论的角度来看,要能做到一致性,会牺牲可用性。而有些系统其实只需要最终一致性 (eventual consistency),这时就不一定要选具有 ACID 特性的资料库,而是可以选择对于可用性、吞吐量比较有帮助的方案。
用思考框架来看 ACID 上
面提到可以用 CAP 角度来看,除了 CAP 外,BASE (Basically Available, Soft state, Eventual consistency) 也是可以用来协助思考,也许不一定要做到完美的一致性。