[shardingSphere 使用与场景3] shardingSphere分布式事务-XA事务

本文介绍了shardingSphere中的XA分布式事务原理,包括基本概念如AP、TM、RM,事务提交的两个阶段,以及Resuorce Manager的角色。讨论了shardingSphere配置XA事务处理器的场景,同时指出了XA事务的性能、可靠性和数据一致性问题。文章还提出了三阶段提交作为优化方案,并详细阐述了其流程和优缺点。
摘要由CSDN通过智能技术生成

概念

XA分布式的基本概念

AP:应用程序
TM:事务管理器,XA事务管理器
RM:资源管理器,指的是数据库链接资源

主要解决的问题是多数据源的操作原子性和数据一致性问题
在这里插入图片描述

事务提交:

执行分片的SQL语句:

RM是由收到TM(XA事务管理器)的指令来触发,该事务还未提交到数据库。

  • 开启事务(XAResource.start)
  • 执行所有的SQL语句(XAResource.excute)
  • 提交事务 (XAResource.commit)
# 第一個分片
xaResource1.start
xaResource1.excute
xaResource1.end
# 第二個分片
xaResource2.start
xaResource2.excute
xaResource2.end
# ...
两阶段式 prepare 和 commit / rollback:

该阶段是有RM与数据库资源通信,当所有数据源链接都是正常状态的时候,把所有事务提交到不同数据源。

# 正常提交情況:
xaResource1.prepare #ack yes
xaResource2.prepare #ack yes
xaResource1.commit #ack commit
xaResource2.commit #ack commit

# 回滾情況:
xaResource1.prepare #ack yes
xaResource2.prepare #ack no
xaResource1.rollback #ack rollback 
xaResource2.rollback #ack rollback 

在第二段提交的时候,任何XAResource的异常会以恢复日志的形式进行数据库补偿,保证数据库操作原子性和数据一致性。

Resuorce Manager的功能

Resuorce Manager 相当于数据库事物的协调者,参与者是各个数据源。

  • 协调所有参与者是否准备好事务提交 prepare
  • 协调所有参与者提交事务 commit
  • 协调所有参与者回滚事务 rollback

shardingSphere 配置XA事务处理器

使用的是mysql,

@Configuration
@Slf4j
public class XADatabaseConfig {
    @Bean
    public XATransactionManager txManager() {
        XADataSource xaDataSource = new MysqlXADataSource();
        AtomikosTransactionManager atomikosTransactionManager = new AtomikosTransactionManager();
        atomikosTransactionManager.registerRecoveryResource("xaDataSource",xaDataSource);
        return atomikosTransactionManager;
    }
}

XA分布式事务的缺陷

  • 性能问题:第二阶段提交时,提交属于同步阻塞状态,且会锁定所有参与者资源(表),参与者多会有性能瓶颈。
  • 可靠性问题:Resoure Manager的单点故障,第二阶段commit的时候,出现单点故障,参与者的资源会一直被锁定,占用资源。
  • 数据一致性问题:第二阶段提交事务的时候,部分参与者故障(网络或者宕机),会导致数据一致性问题

XA两阶段计较的优化方案 - 三阶段提交

  • canCommit 向所有参与者申请资源,准备执行事务操作
  • preCommit 执行事务操作,将 undo 和 redo 信息记入事务日志中,不提交事务
  • doCommit / abort 提交事务 或者 回滚事务
三阶段提交正常流程:

第1阶段提交:向数据申请资源

canCommit
canCommit
canCommit
ack yes
ack yes
ack yes
协调者
参与者1
参与者2
参与者3

第2阶段提交:执行事务操作,undo(回滚日志) 和 redo(重做日志) 信息记入日志中,事务在这阶段并未提交
ps:mysql中还有一个binlog(归档日志)的概念

preCommit
preCommit
preCommit
ack yes
ack yes
ack yes
协调者
参与者1
参与者2
参与者3

第3阶段提交:事务提交

doCommit
doCommit
doCommit
ack yes
ack yes
ack yes
协调者
参与者1
参与者2
参与者3

异常:终止事务
当在任一阶段有异常情况或接收到ack信息超时,会向数据库发送abort,会滚事务

abort
abort
abort
ack yes
ack yes
ack yes
协调者
参与者1
参与者2
参与者3

优点:
优化了阻塞范围,提交事务之后,若出现单点故障,参与者还是会提交事务。
缺点:
doCommit阶段提交abort,若协调者与参与者通信阻断,还是会有数据不一致情况。

总结:XA保证的是强一致性,XA对于大集群分库来说并不是最优策略

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

霸道产品爱上我

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值