对于事务提交,是这样一个流程:
1.发出commit语句;
2.redo进入prepare阶段;
3.写binlog;
4.redo进入commit阶段;
5.事务完成提交
还有两个参数有关联,
1.innodb_flush_log_at_trx_commit
各取值含义:
0,事务提交时,将redo保留在redo buffer,redo日志既不write到OS cache,也不fsync到磁盘,等待MySQL后台线程每秒对redo buffer执行write&fsync;
1,事务提交时,将redo buffer执行write & fsync;
2,事务提交时,将redo buffer执行write到OS cache,但不执行fsync
2.sync_binlog
0,事务提交时,将binlog cache执行write到OS cache,但不执行fsync;
1,事务提交时,将binlog cache执行write & fsync;
N,每提交N个事务,将binlog cache执行write & fsync
那么在实例异常关闭,重启时执行实例恢复,是这样判断一个事务是否已提交:
1.如果存在commit阶段的redo,就认为是已提交的事务;
2.如果存在prepare阶段的redo,又存在对应的binlog,就认为是已提交的事务;
3.如果存在prepare阶段的redo