目录

ACID

说到数据库事务,我们都会提到事务的4大特征:原子性Atomic、一致性Consistency、隔离性Isolation、持久性Durability,简称ACID

在这四大特性中,一致性是最基本的特性,其它的三个特性都为了保证一致性而存在

通俗的转账例子

经典的转账例子,A账户给B账户转账100元(A、B处于同一个库中),如果A的账户发生扣款,B的账户却没有到账,这就出现了数据的不一致。

为了保证数据的 一致性,数据库的事务机制要求A账户扣款B账户到账两个操作要么同时成功,要么同时失败;如果其中有一个操作失败,则多个操作同时回滚,这就是事务的 原子性

而为了保证事务操作的 原子性,需要基于基于日志的REDO/UNDO机制。

但是仅有 原子性 还不够,因为我们的系统是运行在多线程环境下,如果多个事务并行,即使保证了每一个事务的原子性,仍然会出现数据不一致的情况。

例如A账户原来有200元的余额,A账户给B账户转账100元,先读取A账户的余额(200元),然后在这个值上减去100元,但是在这个事务操作未完成前,A账户又准备给C账户转账100元,此时又读取A账户余额(还是200元),那理想状态最后的结果A账户应该扣除200元,但实际情况是A账户只扣除了100元,A账户向C账户转账时,读取的余额属于 幻读,所以为了保证并发情况下的 一致性,又引入的 隔离性,即多个事务并发执行后的状态,和它们串行执行后的状态是一样的。

隔离性又有多种隔离级别,为了实现隔离性(都是为了保证一致性),数据库又引入了锁机制等等

小结

总之ACID,都是为了数据的一致性Consistency,而引入事务原子性Atomic,由于多线程并发问题,又引入事务的隔离性Isolation,而持久性Durability为了保证数据不丢失。