您现在的位置是:亿华云 > 热点
一个注解搞定分布式事务
亿华云2025-10-09 09:04:40【热点】6人已围观
简介Sharding-JDBC目前还整合其他分布式事务模式来解决事务问题,今天就来介绍一下两阶段事务XA是如何解决分布式事务什么是XA规范XA 规范 是 X/Open 组织定义的分布式事务处理DTP,Di
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,b2b供应网名称任意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事务需要添加一个依赖,如下:
org.apache.shardingsphere
sharding-transaction-xa-core
</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配置项,这里就不再给大家详细介绍了。
很赞哦!(7)
热门文章
站长推荐
国际域名转移的费用和处理步骤是什么?
前面这两个步骤都是在本机完成的。到这里还没有涉及真正的域名解析服务器,如果在本机中仍然无法完成域名的解析,就会真正请求域名服务器来解析这个域名了。
为什么大家都选优质域名?到底存在着什么好处?
便宜域名使用如何?小白可以买到便宜域名吗?
只要我们做的是从目前的市场情况选择域名,从简单易记,从个性特征上,我们就可以找到一个好域名进行注册。域名注册进行域名记录和解析以及绑定网站后,客户可以通过URL登录您的网站。
互联网其实拼的也是人脉,域名投资也是一个时效性很强的东西,一个不起眼的消息就会引起整个域名投资市场的动荡,因此拓宽自己的人脉圈,完善自己的信息获取渠道,让自己能够掌握更为多样化的信息,这样才更有助于自己的域名投资。
解析之后一般在十分钟内生效,如果没有生效可以联系域名服务商进行沟通。
用户邮箱的静态密码可能已被钓鱼和同一密码泄露。在没有收到安全警报的情况下,用户在适当的时间内不能更改密码。在此期间,攻击者可以随意输入帐户。启用辅助身份验证后,如果攻击者无法获取移动电话动态密码,他将无法进行身份验证。这样,除非用户的电子邮件密码和手机同时被盗,否则攻击者很难破解用户的邮箱。