innodb_support_xa - xiaoboluo768/qianjinliangfang GitHub Wiki
- 控制是否打开mysql内部XA事务,当为ON时,会打开两阶段提交机制,两阶段提交机制同时确保了二进制日志和Innodb存储引擎数据文件的同步(server层的binlog和innodb存储引擎的事务的一致性)。但同时也时提交过程多了一个额外的prepare刷盘操作。
- 为ON时,一个事务的提交流程变成了这样的
- 会话发起commit操作
- server层发起执行prepare操作通知存储引擎层执行这个事务的redo log刷新操作(注意,在5.6.x的版本中移除了prepare互斥锁,所以并行的事务不需要在这里串行化排队)
- 存储引擎层返回redo log刷新成功给server层
- server层刷新这个事务的binlog到磁盘中
- server层刷新binlog成功之后,在redo log中对这个事务打一个commit标记,表示这个事务已经持久化成功
- 为ON时如果事务在以上提交的任意阶段时发生了crash,恢复过程如下
- 先检查undo log,把undo log中活跃的事务提取出来(没有提交的事务),然后检查这些活跃的事务处于哪个阶段
- 如果处于prepare阶段之前的事务,则直接回滚(因为binlog和redo log中都没有对应事务的记录,无法做恢复),
- 如果处于prepare阶段之后commit标记之前的事务,则需要看事务对应的binlog有没有落盘成功,如果没有落盘成功,则直接回滚,如果binlog落盘成功,则尝试重新在存储引擎redo log中打commit标记进行提交
- 如果处于commit标记之后,则根据redo log进行重做这个事务的操作
- 为OFF时不具备两阶段提交的机制,不能保证一个事务的binlog和redo log的提交顺序一致,但在以下场景下你可以考虑设置该变量为OFF,除此之外就应该设置为ON,否则在崩溃恢复时将导致数据错乱,特别是在主从复制的结构中有并行的事务提交时,关闭XA事务会导致master崩溃恢复之后与从库数据不一致
- 不需要不打开binlog功能,或者不需要保证主从数据的一致性
- 只有一个连接在对数据库做访问,此时关闭XA可以提高数据库的性能
- 只作为读访问的从库,因为从库此时只有一个SQL线程才能对数据做修改(但是,对于多线程复制,也需要设置该参数为ON)
- 全局变量,会话变量,动态变量,默认值为ON,布尔类型。
- PS:该参数在5.7.10版本开始就默认打开,且不允许关闭,因为关闭会导致主备数据不一致。就算设置为OFF也不生效,在8.0版本中已经移除了该配置参数,且内部默认打开xa功能。
- 为ON时,一个事务的提交流程变成了这样的
上一篇:innodb_sort_buffer_size | 下一篇:innodb_status_output