Atomicity 原子性
Consistency 一致性
Isolation 隔离性
Duration 持久性
1. 原子性
1.1 基本概述
一个事务中的操作要么全部成功,要么全部失败;
所以保证原子性的关键点在于如何在事务执行失败的时候撤销之前执行了的操作
1.2 通过undo log实现原子性
undo log与redo log一起构成了Mysql事务日志,事务中每一次修改,InnoDB都会先记录对于的undo log记录
与redo log记录的物理页的修改不同,undo log记录的是逻辑日志
当delete一条记录时,undo log中会记录一条对于的insert记录,反之亦然,当update一条记录的时候,它记录一条对应相反的update记录,如果update的是主键,则是先删除后插入的两个事件的反向逻辑操作
这样,在事务回滚的时候,我们就可以从undo log中反向读取相应的内容,并进行回滚操作,同时,我们也可以根据undo log中记录的日志读取到一条被修改后数据的原值
1.3 开发者需要注意
虽然在发生错误的时候,整个数据库的状态可以恢复,但是如果我们在事务中执行了诸如:向标准输出打印日志,向外界发送邮件等数据库范围之外的操作,那么这些操作作为可见的外部输出都是没有办法回滚的;这些问题都是由应用开发者解决和负责的,在绝大多数情况下,我们都需要在整个事务提交后,再触发类似的无法回滚的操作
1.4 并行事务的原子性
如果没有隔离级别可能出现级联回滚的现象
2. 持久性
2.1 持久性概述
持久性意味着只要事务提交,事务完成,该事务对数据库所作的更改便持久的保存在数据库中,并不会被回滚
即使出现了断电,宕机等任何事故,事务一旦提交就永远地保存
所以持久化地关键在于如何在数据库crash后恢复已经提交的数据
2.2 通过redo log保证crash safe
3. 隔离性
4. 一致性
数据库对于 ACID 中的一致性的定义是这样的:如果一个事务原子地在一个一致地数据库中独立运行,那么在它执行之后,数据库的状态一定是一致的。对于这个概念,它的第一层意思就是对于数据完整性的约束,包括主键约束、引用约束以及一些约束检查等等,在事务的执行的前后以及过程中不会违背对数据完整性的约束,所有对数据库写入的操作都应该是合法的,并不能产生不合法的数据状态。
A transaction must preserve database consistency - if a transaction is run atomically in isolation starting from a consistent database, the database must again be consistent at the end of the transaction.
我们可以将事务理解成一个函数,它接受一个外界的 SQL 输入和一个一致的数据库,它一定会返回一个一致的数据库。
而第二层意思其实是指逻辑上的对于开发者的要求,我们要在代码中写出正确的事务逻辑,比如银行转账,事务中的逻辑不可能只扣钱或者只加钱,这是应用层面上对于数据库一致性的要求