一、ACID 特性
在关系型数据库管理系统中,一个逻辑工作单元要成为事务,必须满足这 4 个特性,即所谓的 ACID:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。
1.1 场景描述
Fenix’s Bookstore 是一个在线书店。每当一本书被成功售出时,需要确保以下三件事情被正确地处理:
- 用户的账号扣减相应的商品款项。
- 商品仓库中扣减库存,将商品标识为待配送状态。
- 商家的账号增加相应的商品款项。
1.2 特性介绍
- 未提交事务,写入后崩溃:程序还没修改完三个数据,但数据库已经将其中一个或两个数据的变动写入磁盘,此时出现崩溃,一旦重启之后,数据库必须要有办法得知崩溃前发生过一次不完整的购物操作,将已经修改过的数据从磁盘中恢复成没有改过的样子,以保证原子性。
- 已提交事务,写入前崩溃:程序已经修改完三个数据,但数据库还未将全部三个数据的变动都写入到磁盘,此时出现崩溃,一旦重启之后,数据库必须要有办法得知崩溃前发生过一次完整的购物操作,将还没来得及写入磁盘的那部分数据重新写入,以保证持久性。
1.2.1 原子性
原子性保证了事务的多个操作要么都生效要么都不生效,不会存在中间状态
原子性:事务是一个原子操作单元,其对数据的修改,要么全都执行,要么全都不执行。
实现原子性和持久性的最大困难是“写入磁盘”这个操作并不是原子的,不仅有“写入”与“未写入”状态,还客观地存在着“正在写”的中间状态。正因为写入中间状态与崩溃都不可能消除,所以如果不做额外保障措施的话,将内存中的数据写入磁盘,并不能保证原子性与持久性。
每写一个事务,都会修改Buffer Pool,从而产生响应的Redo/Undo日志:
- 异常崩溃: 如果事务提交之后,redo log刷入磁盘,结果MySQL宕机了,是可以根据redo log恢复事务修改过的缓存数据的。
- 数据重写: 如果要回滚事务,那