2.5.2 XA事务的提交以及回滚
2.5.2.1 XA事务的提交
在Dble中采用二段提交的方式对于XA事务进行提交 具体的逻辑可见下图
整体来说的处理原则如下:
- 将XA事务的提交分为END PREPARE COMMIT三个部分
- 如果在PREPARE下发之前有节点失败或报错,关闭所有后端连接放弃事务数据
- 如果在PREPARE下发过程中发生失败,则回滚事务,所有节点下发ROLLBACK
- 如果在COMMIT节点发生失败,则尝试重新下发,几次尝试未果将事务交给定时任务来继续重试
2.5.2.2 XA事务的回滚
相对来说回滚的逻辑就容易的多,直接在所有节点下发rollback。如果失败,直接关闭失败的连接。
2.5.2.3 XA事务重试机制
2.19.03.0之前的dble版本对于失败的事务,策略是将事务交给定时任务后台进行无限重试。2.19.03.0版本对这一过程进行了可配置化,并提供管理命令控制这一过程。
2.5.2.3.1 配置
2.19.03.0版本可以通过bootstrap.cnf文件中的xaRetryCount属性配置xa后台重试策略:
- 当 xaRetryCount 等于0时,后台无限重试
当 xaRetryCount 大于0时,后台尝试次数达到xaRetryCount后,重试停止且发送告警
若重试失败,会发出一条告警,重试成功后自动解决相应告警。
2.5.2.3.2 相关命令
2.19.03.0版本新增两个管理命令
- 通过
show @@session.xa
查看后台重试xa事务信息 - 通过
kill @@xa_session id1,id2...
取消指定session后台尝试xa事务
2.5.2.3.3 实现细节
重试时会先从后端连接池中获取连接,如果重试失败,相对应的连接会被关闭回收,更糟糕是重试多次都失败的话,有可能池内的连接都会被回收,此时就会新建后端连接来进行重试