mysql数据库innodb存储引擎之事务原理

事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作要求,即这些操作要么同时成功,要么同时失败。

四大特性:

redo log和undo log:一致性、原子性、持久性。

锁机制及MVCC隔离性。

一、redo log是如何来保证事务的持久性的?

重做日志,记录的是事务提交时数据页的物理修改,是用来实现事务的持久性。

该日志文件由两部分组成:重做日志缓冲(redo log buffer)和重做日志文件(redo log file),前者是在内存中,后者在磁盘中。当事务提交之后会把所有修改信息都存到该日志文件中,用于在刷新脏页到磁盘,发生错误时,进行数据恢复使用。

redo log未出现

mysql数据库innodb存储引擎之事务原理_第1张图片

redo log出现后

 mysql数据库innodb存储引擎之事务原理_第2张图片

二、为什么每次提交要将redo log刷新到磁盘中?

直接将buffer pool当中的变更的数据页直接刷新到磁盘文件中会出现性能问题,因为数据量大,而且都是随机操作数据页,会涉及到大量的随机磁盘io,性能会很低。

而如果说操作的时候用到了redo log,在事务提交时不会直接刷新脏页,先把redo log文件刷新到磁盘当中,因为是log文件,所以是追加的顺序磁盘io,所以性能会比较高。

这种机制叫做WAL(write-ahead logging)

先写日志,过一段时间再将脏页刷新到磁盘io中,那么redo log记录的日志也就不需要了,所以每隔一段时间就会清理掉。

三、undo log

回滚日志,用于记录数据被修改前的信息,作用包含两个:提供回滚和MVCC(多版本并发控制)。

undo log和redo log记录物理日志不一样,它是逻辑日志,可以认为当delete一条记录时,undo log中会记录一条对应的insert记录,反之亦然,当update一条记录时,它记录一条对应相反的update记录。当执行rollback时,就可以从undo log中的逻辑记录读取到相应的内容并进行回滚

undo log销毁:undo log在事务执行时产生,事务提交时,并不会立即删除undo log,因为这些日志可能还用于MVCC。

undo log存储:undo log采用段的方式进行管理和记录,存放在前面介绍的rollback segment回滚段中,内部包含1024个undo log segment。

总结

原子性 - undo log

持久性 - redo log

一致性 - undo log + redo log

隔离性 - 锁 + MVCC

你可能感兴趣的:(数据库,mysql,数据库,mysql,java)