Sharding-JDBC目前集成了其他分布式事务模式来解决事务问题。今天来介绍一下两阶段事务XA是如何解决分布式事务的。XA规范是什么?XA规范是什么?X/Open组织定义的分布式事务处理(DTP,DistributedTransactionProcessing)标准。XA规范描述了全局事务管理器和本地资源管理器之间的接口。XA规范的目的是允许在同一个事务中访问多个资源(如数据库、应用服务器、消息队列等),从而使ACID属性在应用程序之间保持有效。XA规范使用两阶段提交来保证所有资源同时提交或回滚任何特定事务。XA事务的基础是两阶段提交协议。需要交易协调员来确保所有交易参与者都准备就绪(阶段1)。如果协调器收到所有参与者都准备就绪的消息,它会通知所有事务它们已准备好提交(阶段2)。MySQL在这个XA事务中扮演的是参与者的角色,而不是协调者(事务管理器)。MySQL中的XA事务分为外部XA和内部XA:外部XA:可以参与外部分布式事务,需要协调器参与协调内部XA:用于同一实例下的跨引擎事务,以Binlog为协调器,比如在存储引擎提交时,需要将提交信息写入二进制日志,二进制日志是一个分布式内部XA事务,只不过二进制日志的参与者是MySQL本身。基于XA规范的分布式事务对业务是非侵入性的,用户可以像使用本地事务一样使用基于XA规范的分布式事务。但是基于XA规范的分布式事务属于强一致性事务,性能比较低。特别是在长事务的情况下,对资源的锁定时间比较长,一般适用于短事务、低并发的场景。MySQL中的XA事务下面我们来演示一下MySQL中的XA,如下;上面的命令是什么意思?分析如下:XASTART"test_xid":启动一个XA事务,test_xid为全局事务xid,名称任意updateproduct_basesetprice=1000whereproduct_id=743948772064624640:执行的S??QL语句XAEND"test_xid":这意味着一个XATransaction结束,此时事务的状态变为IDLE。XAPREPARE“test_xid”:这会将事务设置为PREPARE状态。XACOMMIT"test_xid":这用于提交事务。提交后,事务的状态为COMMITED。XAROLLBACK"test_xid":用于回滚Sharding-JDBC中的XA事务。Sharding-JDBC集成了XA事务的支持,支持Atomikos、NARAYANA、BITRONIX事务的实现。默认实现是Atomikos。下面将以Atomikos为例,介绍Sharding-JDBC是如何实现XA事务的。SharingSphere使用SPI来定制分布式事务解决方案。XA的默认实现是org.apache.shardingsphere.transaction.xa.XAShardingTransactionManager。有兴趣的可以看看源码。源码后面介绍的弱一致性事务使用的是Seata的AT模式,对应org.apache.shardingsphere.transaction.base.seata.at.SeataATShardingTransactionManager。当然,Seata也支持XA事务。如果后面改写,可以通过SPI自定义1.添加依赖要使用XA事务,需要添加依赖,如下:dependency>
