一 简介:今天咱们来聊聊 mysql 两阶段提交
二 事务过程
perpare-commit 两个过程
1 perpare阶段 redo日志
1.设置undo state=TRX_UNDO_PREPARED; //trx_undo_set_state_at_prepare调用
2.刷事务更新产生的redo日志;【步骤1产生的redo日志也会刷入】
2 commit阶段 binlog日志
1.将事务产生的binlog写入文件,刷入磁盘;
2.设置undo页的状态,置为TRX_UNDO_TO_FREE或TRX_UNDO_TO_PURGE; //标记可以清理回滚段
3.记录事务对应的binlog偏移,写入系统表空间;
三 故障处理流程(只考虑意外down机导致的缓存丢失情况)
1.prepare阶段,redo log落盘前,mysqld crash
事务回滚,没有相关binlog和redo
2.prepare阶段,redo log落盘后,binlog落盘前,mysqld crash
事务回滚,可以搜集到相关redo log,没有相关binlog
3.commit阶段,binlog落盘后,mysqld crash
事务重做,binlog和redo log都有
总结: 对于异常的xa事务,若binlog已落盘,则事务应该提交;binlog未落盘,则事务就应该回滚
四 相关参数
1 innodb_flush_log_at_trx_commit =》redo log
0 每隔1s,每个事务提交,会写入mysqld自己的log buffer中,每隔1秒将log buffer的内容写到log file中,然后flush到磁盘。
1 每次commit时,刷redo日志,确定fsync刷盘
2 当为2时,每个事务提交,就会被写到log file(OS cache),但是log file每隔1秒才会被flush到磁盘,当操作系统crash或断电时,此时至多丢失1秒的事务。
0和2的区别是,
为0时,mysqld或操作系统crash则会导致1秒内的事务被丢失。
为2时,当操作系统crash或断电会导致1秒内的事务被丢失。
2 sync_log
0 由操作系统自己决定什么时候刷新缓存到持久化设置
1 表示每次commit时binlog都会fsync。
N 表示每N次commit时binlog都会fsync。
建议:保险设置为双1,如果为了提高性能,设置为2 N N不宜太大
五 暂时先到这里