MySQL事物系列:2:事物的实现

1:事物的隔离性由锁来实现。事物的持久性和事物的原子性通过redo log来实现。事物的一致性通过undo log来实现。

redo log恢复提交事物修改的页操作

undo log回滚到行记录某个特定版本。

redo通常是物理日志,记录的是页的修改操作;undo是逻辑日志,根据每行记录进行记录。

2:redo 

redo重做日志用来实现事物的持久性,即事物ACID中的D。由两部分组成:内存中的redo log buffer 和磁盘上的redo log file是持久的。

InnoDB是事物的存储引擎,通过Force Log at Commit机制实现事物的持久性。即当事物提交时,必须将该事物的所有日志写入到重做日志文件进行持久化。待事物的COMMIT操作完成才算完成。

3:undo

undo log用来帮助事物的回滚及MVCC的功能。redo log是顺序写的,在数据库运行时不需要对redo log的文件进行读取操作。而undo log是需要进行随机读写的。

4:fsync

为了确保每次日志都写入重做日志文件,在每次将重做日志缓冲写入重做日志文件后,InnoDB存储引擎都需要调用一次fsync操作。由于重做日志文件打开并没有使用O_DIRECT选项。因此重做日志缓冲先写入文件系统缓存,为了确保重做日志写入磁盘,必须进行一次fsync操作。由于fsync的效率取决于磁盘的性能,因此磁盘的性能决定了事物提交的性能,也就是数据库的性能。

5:innodb_flush_log_at_trx_commit

InnoDB 引擎允许用户手工设置非持久的情况发生,以此提高数据库的性能。即当事物提交时,日志不写入重做日志文件,而是等一个时间周期后再执行fsync操作。但是当数据库宕机时,由于部分日志没有刷新到磁盘,因此会丢失最后一段时间的事物。

innodb_flush_log_at_trx_commit 用来控制事物刷新磁盘的策略。

该参数的默认值为1

09:35:49>SHOW VARIABLES LIKE '%innodb_flush_log_at_trx_commit%';
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 1     |
+--------------------------------+-------+
1 row in set (0.00 sec)

该值还可以设置为0或者2。0表示事物提交时不进行写入重做日志操作,这个操作在master thread中1秒会进行一次重做日志文件的fsync操作;2表示事物提交时将重做日志写入重做日志文件,但仅写入文件系统的缓冲,不进行fsync操作。在这个设置下MySQL宕机而操作系统没有宕机,事物不会丢失。而当操作系统宕机时,重启数据库后会丢失未从文件系统刷新到重做日志文件的部分事物。

原文地址:https://www.cnblogs.com/xiaoit/p/4552461.html