不考虑组提交方式,当sync_binlog=1、innodb_flush_log_at_trx_commit=1时,一个事物的流程:加载数据页到内存--> 修改数据undo -->更新数据到内存-->写入redolog(状态为prepare)-->写binlog-->redolog flush-->binlog flush-->提交事务(redolog状态修改为commit)。MySQL为了保证redo log 和binlog一致性,内部事物提交采用xa两阶段方式,以下关于这个事物的说法,正确的是()
**A.**如果redo log file中未提交,binlog file中存在,会将redo log中的这个未提交事物提交。
**B.**如果redo log file中未提交,binlog file中不存在,会将redo log中的这个未提交事物回滚。
**C.**如果redo log file中已提交,binlog file中存在,正常完成的事务,不需要恢复。
**D.**如果redo log file中已提交,binlog file中不存在,会将redo log中的这个提交事物回滚。
答案:ABC
**解释:**D.根据2PC,双1模式下,不会存在此种情况。redo log prepare阶段的redo log落盘的时间节点是在binlog落盘前,也就是binlog完全落盘则表明redo log prepare阶段的redo log已经落盘完成,如果binlog未落盘,则redo log不会落盘。
binlog为server层日志,redo log为引擎层日志,一个事务的提交必须写redo log和binlog,MySQL通过两阶段提交2PC(内部XA的两阶段提交)解决这一问题。参数innodb_support_xa默认为on,表示启用XA,虽然它会导致一次额外的磁盘flush(prepare阶段flush redo log)。但必须启用,而不能关闭它。因为关闭会导致binlog写入的顺序和实际的事务提交顺序不一致,会导致崩溃恢复和slave复制时发生数据错误。如果启用了log-bin参数,并且不止一个线程对数据库进行修改,那么就必须启用innodb_support_xa参数。