ACID靠什么保证的?
原子性
- 原子性是由
undolog
日志来保存的,它记录了需要回滚的日志信息。 - 事务回滚时,撤销已经执行成功的 SQL 语句,什么意思?
- 我们做增、删、改这样一些 SQL 操作,它之前已经保留好一个历史版本数据了,而这个历史版本数据会存在于 undolog 中
- 我们写一条
insert
,就会记录一条delete
- 我们写一条
- 所以当你进行回滚的时候,它会找到你对应的一个历史版本数据
- 然后进行回写,把之前成功执行的 SQL 语句给你撤销掉,这个时候就完成了最基本的一个回滚操作,这是原子性对应的一个保证。
持久性
- 持久性是用什么来保证的?持久性由
redolog
来进行保证 - 当我们要修改数据时,MySQL是先把这条记录所在的「页」(也就是B+树上的叶子节点)找到,然后把该页加载到内存中,在内存中进行修改。
- 还会写一份redo log,这份redo log记载着这次在某个页上做了什么修改、执行了什么sql。
- 即便MySQL在中途挂了,我们还可以根据redo log来对数据进行恢复。
隔离性
- 什么叫隔离性?
- 我们要保证我事务之间彼此是不会受相互打扰的,每个事务跟每个事务都是相互隔离的。
- 因此,这个时候需要通过 MVCC 技术来进行实现。
- MVCC 是多版本并发控制,这种技术非常麻烦,它包含了非常多的信息。
- 隔离性是由 MVCC 来保证 -> 出现了RR、RC的隔离情况
一致性
- 一致性就是事务的目的所在
- 前面的保证原子性、持久化、隔离性都是为了保证一致性