ACID四大原则
atomicity 原子性
定义:事务的所有操作,要么全部完成,要么全部不完成,不会结束在某个中间环节。
实现原理:Mysql通过WAL(写前日志)技术来实现的。我们知道Innodb引擎是提供了 redo_log 和undo_log的。同一事务下,如果一个失败了 就会通过undo_log回滚到修改前。
undo log: 属于逻辑日志,它记录的是sql执行的相关信息,当发生回滚时,InnoDB会根据undo log的内容做与之前相反的工作:对于每个insert,回滚时会执行delete;对于每个delete,回滚时会执行insert;对于每个update,回滚时会执行一个相反的update,把数据改回去。
consistency 一致性
定义:事务开始之前和事务结束之后,数据库的完整性限制未被破坏。
一致性包含两部分:
- 约束一致性:Mysql的外键约束以及唯一索引约束。所以约束一致性很好理解(显示约束)
- 数据一致性:我认为是一个综合的规定,或者说是一个把握全局的规定,因为它是由原子性、持久性、隔离性共同保证的结果,而不是单单依赖于某一个技术。
- 实例:比如对银行的转行事务,不管成功还是失败,事务后的存款的账户合是不会变的。
总结: 一致性就是:应用系统从一个正确的状态到另一个正确的状态,而ACID就是说事务能够通过ACID来保证这个C的过程,C是目的 AID是手段
isolation 隔离性
定义:当多个事务并发访问数据库中的同一数据时,所表现出来的相互关系。
通俗定义:指的是一个事务的执行不能被其他事务干扰,即一个事务内部的操作即使用的数据对其他的并发事务时隔离的,锁和多版本控制就符合隔离性
隔离性的两种关键的技术:
- 单版本控制-锁:
理解:锁用独占的方式来保证在只有一个版本的情况下事务之间相互隔离,所以锁可以理解为单版本控制。在mysql事务中,我们所熟知并且一直在用的 RR(可重复读)隔离级别,就是通过GAP锁来防止数据的写入的,所以它的并行度不够,容易导致死锁。
扩展知识:现在比较流行的方式是 Row+RC模式的隔离级别,可以很大程度上提高数据库的读写并行度。(后期单独开一篇讲这个模式)- 多版本控制-MVCC:
只在读已提交和可重复读的隔离级别下出现。
理解:是指在数据库中,为了实现高并发的数据访问,对数据进行多版本处理,并通过事务的可见性来保证事务能看到自己应该看到的数据版本。
实现方式:通过Undo log日志的版本链和ReadView一致性视图来实现的。(后期会单独开一期讲MVCC)
总结:将会在下章中讲详细讲讲 四种隔离级别
durability 持久性
定义:事务完成之后,事务所做的修改进行持久化保存,不会丢失。
通俗定义:会将数据保存在磁盘当中。
理解:通过原子性可以保证逻辑上的持久性,通过存储引擎的数据刷盘可以保证物理上的持久性,持久性是保证了MySQL数据库的高可靠性,而不是高可用性。
涉及到实现的日志:redo log,bin log,
具体技术:MySQL的Innodb存储引擎,使用redo log保证了事务的持久性,当事务提交,必须先将事务的所有日志写入日志文件进行持久化,就是WAL(写前日志)机制,可以保证在宕机或者停电等情况发生后,已提交的事务不会丢失,这就是我们常说的 Crash-safe能力。