目录

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账户转账时,读取的余额属于幻读,所以为了保证并发情况下的一致性,又引入的隔离性,即多个事务并发执行后的状态,和它们串行执行后的状态是一样的。

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