一个注解搞定分布式事务

Sharding-JDBC目前还整合其他分布式事务模式来解决事务问题,今天就来介绍一下两阶段事务XA是如何解决分布式事务

什么是XA规范

XA 规范 是 X/Open 组织定义的分布式事务处理(DTP,Distributed Transaction Processing)标准。

XA 规范描述了全局的事务管理器与局部的资源管理器之间的接口。XA规范的目的是允许多个资源(如数据库,应用服务器,消息队列等)在同一事务中访问,这样可以使 ACID 属性跨越应用程序而保持有效。

XA 规范使用两阶段提交来保证所有资源同时提交或回滚任何特定的事务。

XA 事务的基础是两阶段提交协议。需要有一个事务协调者来保证所有的事务参与者都完成了准备工作(第一阶段)。如果协调者收到所有参与者都准备好的消息,就会通知所有的事务都可以提交了(第二阶段)。

MySQL 在这个 XA 事务中扮演的是参与者的角色,而不是协调者(事务管理器)。

MySQL中的XA事务分为外部XA和内部XA:

  • 外部XA:可以参与外部的分布式事务,需要协调者参与协调
  • 内部XA:用于同一实例下跨多引擎事务,由 Binlog 作为协调者,比如在一个存储引擎提交时,需要将提交信息写入二进制日志,这就是一个分布式内部 XA 事务,只不过二进制日志的参与者是 MySQL 本身。

基于XA规范分布式事务对业务是无侵入的,用户可以像使用本地事务一样使用基于XA规范的分布式事务。

但是基于XA规范的分布式事务属于强一致性事务,性能比较低,尤其在长事务的情况下,对资源的锁定时间较长,一般适用于短事务、低并发的场景。

MySQL中XA事务

接下来就以为MySQL中XA来演示一下,如下;

上述命令什么意思呢?解析如下:

  • XA START “test_xid”​:开启一个XA事务,test_xid是全局事务xid,名称任意
  • update product_base set price=1000 where product_id=743948772064624640:执行的SQL语句
  • XA END “test_xid”​:这个表示结束一个 XA 事务,此时事务的状态转为IDLE。
  • XA PREPARE “test_xid”:这个将事务置为 PREPARE 状态
  • XA COMMIT “test_xid”:这个用来提交事务,提交之后,事务的状态就是 COMMITED。
  • XA ROLLBACK “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事务需要添加一个依赖,如下:

<!-- 使用XA事务时,需要引入此模块 -->
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-transaction-xa-core</artifactId>
</dependency>

可以看到这个依赖中内置了ATOMIKOS,如下:

2. 配置事务管理器

使用事务之前当然需要配置一个事务管理器,这里和Spring Boot 中配置没差别,如下:

@Configuration
@EnableTransactionManagement
public class TransactionConfiguration {
@Bean
public PlatformTransactionManager txManager(final DataSource dataSource){
return new DataSourceTransactionManager(dataSource);
}
}

3. @ShardingTransactionType注解

想要开启XA分布式事务还需要使用一个注解@ShardingTransactionType,其中的value属性的值如下:

  • TransactionType.LOCAL:开启本地事务的支持,默认值
  • TransactionType.XA:开启XA事务的支持
  • TransactionType.BASE:开启弱事务的支持

那么显然这里只需要配置TransactionType.XA就能开启XA事务的支持

伪代码如下:

@ShardingTransactionType(value = TransactionType.XA)
@Transactional
public void method(){
//跨库操作
..............
}

4. 启动测试

演示的源码请看视频教程中的源码,需要注意的是Atomikos会在项目的logs目录下生成xa_tx.log文件,其中记录了事务日志,在XA崩溃恢复时所需要的日志,一定不要删除

对于Atomikos的一些配置可以通过在项目的classpath中添加jta.properties来定制化Atomikos配置项,这里就不再给大家详细介绍了。

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/241155.html<

赞 (0)
管理的头像管理
上一篇2025-04-24 05:11
下一篇 2025-04-24 05:12

相关推荐

  • jsp空间购买和交换数据空间怎么买,有哪些注意事项?

    购买JSP空间时,是否考虑过数据交换空间的性能?简米科技(2003年始创,23年行业沉淀)与酷番云(工信部一类增值电信全牌照)这类持牌自营机房的服务商,能确保数据交换的高效稳定,是值得优先选择的合作伙伴,为什么JSP空间需要搭配独立的数据交换空间从JSP应用特性看数据交换需求JSP基于Java技术,常用于企业级……

    2026-08-11
    0
  • 建网站用香港空间效果怎么样,香港空间稳定吗?

    建网站用香港空间,对于创建网站资产来说,核心价值在于免备案和全球带宽优势,尤其适合外贸、跨境电商和需要快速启动的项目,但你必须权衡国内访问延迟,并选择有资质的服务商以保证资产安全,香港空间的核心优势与适用边界免备案:节省时间就是节省成本国内服务器需要备案,通常需要10到20天,香港空间无需备案,域名解析后即可上……

    2026-08-11
    0
  • Java连接云数据库的方法是什么,如何操作

    Java连接云数据库的核心在于通过JDBC驱动,结合云服务商提供的连接地址、端口、数据库名及认证信息,配置安全策略(如SSL、IP白名单),即可实现稳定高效的远程数据库访问,基础准备:JDBC驱动与依赖管理连接云数据库前,需要确保开发环境具备对应的JDBC驱动,以最常见的MySQL为例,你需要引入mysql-c……

    2026-08-11
    0
  • 建网站公安联网备案必须使用数据码吗,备案流程是什么

    网站备案包括ICP备案和公安联网备案,两者缺一不可,公安联网备案必须使用服务商提供的数据码,选择持有合法资质的服务商是顺利通过备案的前提,为什么网站必须进行公安联网备案根据公安部《计算机信息网络国际联网安全保护管理办法》,网站开通后30日内必须到公安机关办理备案手续,未完成公安备案的网站,面临责令整改、关闭网站……

    2026-08-10
    0
  • 建一个企业网站大概需要多少钱?,怎么收费?

    建网站要多少钱,没有一个固定的数字,几百到几万都可能,但真正的“创建网站资产”绝不仅仅是初次投入的成本,而是基于长期稳定、合规和安全的持续性投入,其中核心取决于你选择了什么样的“地基”来承载你的业务,建站预算的构成与行业基准当你开始规划一个网站,最先面对的就是预算问题,一个常见的误区是只关注网站“看起来”的建造……

    2026-08-10
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注