事务的实现原理(深入理解ACID)
ACID,是数据库事务正确执行的四个基本要素的缩写。包含:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。
- A=Atomicity,指的是原子。即要么全部成功,要么全部失败,不可能只执行一部分操作。
- C=Consistency,指的是一致性。即系统(数据库)总是从一个一致性的状态转移到另一个一致性的状态,不会存在中间状态。
- I=Isolation,指的是隔离性。通常来说,一个事务在完全提交之前,对其他事务是不可见的。
- D=Durability,指的是持久性。一旦事务提交,那么就永远是这样子了,哪怕系统崩溃也不会影响结果。
1.持久性的实现(redo log)
redo log叫做重做日志,是用来实现事务的持久性。
该日志文件由两部分组成:重做日志缓冲(redo log buffer)以及重做日志文件(redo log),前者是在内存中,后者在磁盘中。
mysql 为了提升性能不会把每次的修改都实时同步到磁盘,而是会先存到Boffer Pool(缓冲池)里头,把这个当作缓存来用。然后使用后台线程去做缓冲池和磁盘之间的同步。
那么问题来了,如果还没来的同步的时候宕机或断电了怎么办?还没来得及执行上面图中红色的操作。这样会导致丢部分已提交事务的修改信息!
所以引入了redo log来记录已成功提交事务的修改信息,并且会把redo log持久化到磁盘,系统重启之后在读取redo log恢复最新数据。
总结:
redo log是用来恢复数据的 用于保障,已提交事务的持久化特性。
2.原子性的实现(undo log)
undo log 叫做回滚日志,用于记录数据被修改前的信息。他正好跟前面所说的重做日志所记录的相反,重做日志记录数据被修改后的信息。
undo log 记录事务修改之前版本的数据信息,因此假如由于系统错误或者rollback操作而回滚的话可以根据undo log的信息来进行回滚到没被修改前的状态。
总结:
undo log是用来回滚数据的用于保障 未提交事务的原子性。
3.隔离性的实现(读写锁+MVCC多版本并发控制)
个人暂未透彻理解,先空着
4.一致性的实现
而事务的终极大 boss 一致性是通过原子性,持久性,隔离性来实现的!!!