Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

MySQL满足ACID的特性,所以MySQL事物的原理就是innodb是如何去实现ACID的特性。

首先A就是原子性,就是要保证DML数据库操作语言要么都成功,要么都失败,都成功好理解,如果都失败就意味着要把原本执行的操作都回滚,所以innodb里面设计了一个undo log表,在事物执行的过程中把执行数据的快照保存在undo log表里,例如执行一个insert语句,在undo log表里就存储一个delete语句,一旦出现错误就直接读取undo log执行反向操作就行了。

其次就是C一致性,表示数据的约束没有得到破坏,这个更多是依靠业务层的保障,数据库里面也提供了像主键约束,唯一约束,字段长度约束等。

I是隔离性,多个并行事物对同一个数据进行操作如何去避免多个事物的干扰导致数据混乱。innodb里面实现了SQL92的标注,提供了四个隔离级别的实现,分别是未提交读、已提交读、可重复读以及串行化。innodb默认实现的是可重复读,并且使用了MVCC解决了脏读和不可重复读的问题,然后使用了行锁或者表锁的方式来解决幻读的问题。

D是持久性,也就是说事物提交后的数据一定是永久化保留,不能因为数据库宕机或者其他原因导致数据变更的失效。理论上说事物提交后直接放在磁盘保存就好了,但是因为随机磁盘IO的效率确实很低,所以innodb设计了Buffer pool缓冲区来进行优化,数据更新的时候先更新缓冲区,然后在合适的时间持久化到磁盘里。但是在这个过程中可能会因为数据库宕机导致数据丢失,因此innodb引入了redo log文件,这个文件存储了数据库变更后的值,我们通过事物进行数据更改的时候,除了修改内存缓冲区里的数据以外,还会被本次修改的值追加到redo log里面,当事物提交的时候直接把redo log里面的日志刷新到磁盘里面进行持久化,一旦数据库宕机在MySQL重启以后可以直接用redo log里面保存的重写日志读取再执行一遍。

因此认为,MySQL事物的原理就是innodb如何实现ACID的特性,用到了MVCC、行锁、表锁、缓冲区、redo log和undo log来实现。

评论