一个注解搞定分布式事务

简介: 一个注解搞定分布式事务

大家好,我是不才陈某~

陈某的《Spring Cloud Alibaba实战项目》 视频教程已经录完了,涉及到Alibaba的各种中间件、OAuth2微服务认证鉴权全链路灰度发布分布式事务实战,戳这里--->Spring Cloud Alibaba 实战 视频专栏 开放订阅~

这是《亿级数据分库分表实战》专栏的第6篇文章,往期文章如下:

上篇介绍了Sharding-JDBC的本地事务在网络、硬件故障下是无法保证分布式事务。

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

什么是XA规范

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

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

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

关于两阶段提交事务模式不清楚的可以看之前的文章:七种分布式事务解决方案

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

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

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

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

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

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

MySQL中XA事务

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

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

  1. XA START "test_xid":开启一个XA事务,test_xid是全局事务xid,名称任意
  2. update product_base set price=1000 where product_id=743948772064624640:执行的SQL语句
  3. XA END "test_xid":这个表示结束一个 XA 事务,此时事务的状态转为 IDLE
  4. XA PREPARE "test_xid":这个将事务置为 PREPARE 状态
  5. XA COMMIT "test_xid":这个用来提交事务,提交之后,事务的状态就是 COMMITED。
  6. 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属性的值如下:

  1. TransactionType.LOCAL:开启本地事务的支持,默认值
  2. TransactionType.XA:开启XA事务的支持
  3. 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配置项,这里就不再给大家详细介绍了。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
NoSQL Java Redis
基于Redisson和自定义注解的分布式锁实现策略。
在实现分布式锁时,保证各个组件配置恰当、异常处理充足、资源清理彻底是至关重要的。这样保障了在分布布局场景下,锁的正确性和高效性,使得系统的稳健性得到增强。通过这种方式,可以有效预防并发环境下的资源冲突问题。
513 29
|
NoSQL 安全 Java
nicelock--一个注解即可使用Redis分布式锁!
Nicelock的引入为分布式系统中的资源同步访问提供了一个简单高效和可靠的解决方案。通过注解的方式,简化了锁的实现和使用,使开发人员可以将更多精力专注于业务逻辑的实现,而不是锁的管理。此外,Nicelock在保持简单易用的同时,也提供了足够的灵活性和可靠性,满足了不同应用场景下对分布式锁的需求。
351 1
|
Web App开发 开发框架 前端开发
SpringCloud微服务实战——搭建企业级开发框架(三十九):使用Redis分布式锁(Redisson)+自定义注解+AOP实现微服务重复请求控制
通常我们可以在前端通过防抖和节流来解决短时间内请求重复提交的问题,如果因网络问题、Nginx重试机制、微服务Feign重试机制或者用户故意绕过前端防抖和节流设置,直接频繁发起请求,都会导致系统防重请求失败,甚至导致后台产生多条重复记录,此时我们需要考虑在后台增加防重设置。
993 53
SpringCloud微服务实战——搭建企业级开发框架(三十九):使用Redis分布式锁(Redisson)+自定义注解+AOP实现微服务重复请求控制
|
缓存 NoSQL Java
【亮剑】分布式锁是保证多服务实例同步的关键机制,常用于互斥访问共享资源、控制访问顺序和系统保护,如何使用注解来实现 Redis 分布式锁的功能?
【4月更文挑战第30天】分布式锁是保证多服务实例同步的关键机制,常用于互斥访问共享资源、控制访问顺序和系统保护。基于 Redis 的分布式锁利用 SETNX 或 SET 命令实现,并考虑自动过期、可重入及原子性以确保可靠性。在 Java Spring Boot 中,可通过 `@EnableCaching`、`@Cacheable` 和 `@CacheEvict` 注解轻松实现 Redis 分布式锁功能。
520 0
|
存储 Java 测试技术
35分布式电商项目 - 注解式事务配置(运营商后台)
35分布式电商项目 - 注解式事务配置(运营商后台)
164 1
|
消息中间件 NoSQL JavaScript
Spring Boot加一个注解,轻松实现 Redis 分布式锁
Spring Boot加一个注解,轻松实现 Redis 分布式锁
35652 2
|
消息中间件 NoSQL JavaScript
使用注解实现redis分布式锁
使用注解实现redis分布式锁
|
druid Java 数据库连接
Springboot 整合druid+mybatis+jta分布式事务+多数据源aop注解动态切换 (一篇到位)
Springboot 整合druid+mybatis+jta分布式事务+多数据源aop注解动态切换 (一篇到位)
831 1
Springboot 整合druid+mybatis+jta分布式事务+多数据源aop注解动态切换 (一篇到位)
|
NoSQL Java Redis
如何使用注解实现分布式锁
如何使用注解实现分布式锁
627 0
|
存储 NoSQL Java
一个注解实现分布式锁
一个注解实现分布式锁
462 0

热门文章

最新文章