事务的实现原理(深入理解ACID)

ACID,是数据库事务正确执行的四个基本要素的缩写。包含:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。

  • A=Atomicity,指的是原子。即要么全部成功,要么全部失败,不可能只执行一部分操作。
  • C=Consistency,指的是一致性。即系统(数据库)总是从一个一致性的状态转移到另一个一致性的状态,不会存在中间状态。
  • I=Isolation,指的是隔离性。通常来说,一个事务在完全提交之前,对其他事务是不可见的。
  • D=Durability,指的是持久性。一旦事务提交,那么就永远是这样子了,哪怕系统崩溃也不会影响结果。

 

1.持久性的实现(redo log)

redo log叫做重做日志,是用来实现事务的持久性。

该日志文件由两部分组成:重做日志缓冲(redo log buffer)以及重做日志文件(redo log),前者是在内存中,后者在磁盘中。

事务的实现原理(深入理解ACID)

mysql 为了提升性能不会把每次的修改都实时同步到磁盘,而是会先存到Boffer Pool(缓冲池)里头,把这个当作缓存来用。然后使用后台线程去做缓冲池和磁盘之间的同步

那么问题来了,如果还没来的同步的时候宕机或断电了怎么办?还没来得及执行上面图中红色的操作。这样会导致丢部分已提交事务的修改信息!

所以引入了redo log来记录已成功提交事务的修改信息,并且会把redo log持久化到磁盘,系统重启之后在读取redo log恢复最新数据。

总结:

redo log是用来恢复数据的 用于保障,已提交事务的持久化特性。

 

2.原子性的实现(undo log)

undo log 叫做回滚日志,用于记录数据被修改前的信息。他正好跟前面所说的重做日志所记录的相反,重做日志记录数据被修改后的信息。

事务的实现原理(深入理解ACID)

undo log 记录事务修改之前版本的数据信息,因此假如由于系统错误或者rollback操作而回滚的话可以根据undo log的信息来进行回滚到没被修改前的状态。

总结:

undo log是用来回滚数据的用于保障 未提交事务的原子性。

 

3.隔离性的实现(读写锁+MVCC多版本并发控制)

个人暂未透彻理解,先空着

 

4.一致性的实现

而事务的终极大 boss 一致性是通过原子性,持久性,隔离性来实现的!!!