springcloud整合seata的实现代码
作者:huan1993 发布时间:2022-04-26 23:49:49
一、背景
在上一篇文章中,我们使用Seata整合了SpringBoot,在这篇文章中我们使用Seata整合SpringCloud。同时有了上一篇文章的基础,此处我们简单实现。
二、项目结构
三、实现功能:
完成用户下单操作,下单分为调用 账户服务 扣除余额,调用订单服务创建订单。
四、项目使用到的技术
Spring Cloud 、eureka、openfeign、seata 、nacos、druid、mybatis-plus
五、整合步骤
1、引入spring-cloud-starter-alibaba-seata jar包
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
<version>2021.1</version>
<exclusions>
<exclusion>
<artifactId>seata-spring-boot-starter</artifactId>
<groupId>io.seata</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>io.seata</groupId>
<artifactId>seata-spring-boot-starter</artifactId>
<version>1.4.2</version>
</dependency>
参考文档: https://seata.io/zh-cn/docs/ops/deploy-guide-beginner.html
2、涉及到的业务库操作
1、业务库需要存在 undo_log 表
CREATE TABLE IF NOT EXISTS `undo_log`
(
`branch_id` BIGINT NOT NULL COMMENT 'branch transaction id',
`xid` VARCHAR(128) NOT NULL COMMENT 'global transaction id',
`context` VARCHAR(128) NOT NULL COMMENT 'undo_log context,such as serialization',
`rollback_info` LONGBLOB NOT NULL COMMENT 'rollback info',
`log_status` INT(11) NOT NULL COMMENT '0:normal status,1:defense status',
`log_created` DATETIME(6) NOT NULL COMMENT 'create datetime',
`log_modified` DATETIME(6) NOT NULL COMMENT 'modify datetime',
UNIQUE KEY `ux_undo_log` (`xid`, `branch_id`)
) ENGINE = InnoDB COMMENT ='AT transaction mode undo table';
2、业务表主键
业务表中必须包含单列主键,如果存在多列主键,则目前只有mysql支持。
3、页面中自动更新时间戳
业务表中最好不要自动更新时间戳,使用手动更新,更新数据,只更新用到的数据。
比如:
表中存在10个字段,当前业务只需要更新3个字段,此时我们更新3个字段即可,不要更新10个字段,如果update_time字段是默认更新的,则使用手动更新。
3、开启数据源代理
1、自动配置数据源代理
seata:
enabled: true
# 是否自动开启数据源代理
enable-auto-data-source-proxy: true
# 数据源代理模式,使用AT模式
data-source-proxy-mode: AT
2、手动配置AT模式数据源代理
1、配置文件关闭自动数据源代理
seata:
# 是否自动开启数据源代理
enable-auto-data-source-proxy: false
2、配置配置数据源
AT模式下返回的数据源一定需要是 DataSourceProxy
@Bean
public DataSource dataSourceProxy() {
// 某一个数据源
XxxDataSource xxxDataSource = new XxxDataSource();
// 设置数据源的各种配置属性
xxxDataSource.setXXX("");
// 使用 DataSourceProxy 来包装一下
return new DataSourceProxy(xxxDataSource);
}
4、传递 xid
在引入了 spring-cloud-starter-alibaba-seata
后,很多都已经实现了自动传递 xid
。同时在分布式事务结束后,需要清除xid的值。
默认实现了 feign
、rest
和web
3种方式的 xid
的传递。
5、事务分组和seata server对应上
6、注册中心和配置中心
应用程序中 seata 的配置中心和 注册中心 需要和 seata server 的保持一致。
7、业务方法加上@GlobalTransactional 注解
在需要开启分布式事务的方法上加入 @GlobalTransactional 注解,开启分布式事务。
public class BusinessServiceImpl implements BusinessService {
private final OrderService orderService;
private final AccountClient accountClient;
@Override
// 开启分布式事务
@GlobalTransactional(rollbackFor = Exception.class)
public void createAccountOrder(Integer accountId, Long amount, boolean hasException) {
System.out.println("xid:" + RootContext.getXID());
// 1、远程扣减账户余额
remoteDebit(accountId, amount);
// 2、下订单
orderService.createOrder(accountId, amount);
if (hasException) {
throw new RuntimeException("发生了异常,分布式事物需要会滚");
}
}
private void remoteDebit(Integer accountId, Long amount) {
String result = accountClient.debit(accountId, amount);
log.info("远程扣减库存结果:[{}]", result);
}
}
六、演示
分布式事务发生异常,事务回滚
七、完整代码
https://gitee.com/huan1993/spring-cloud-parent/tree/master/seata/seata-springcloud-mybatis-plus
八、参考文档
1、新人文档
2、seata常见问题
来源:https://www.cnblogs.com/huan1993/p/15416067.html


猜你喜欢
- 本文介绍了Android ItemDecoration 实现分组索引列表的示例代码,分享给大家。具体如下:先来看看效果:我们要实现的效果主要
- 从Microsoft .Net 2.0版本以后,就默认提供了System.IO.Ports.SerialPort类,用户可以非常简单地编写少
- 本文实例讲述了Android编程获取通知栏高度的方法。分享给大家供大家参考,具体如下:这里通过反射机制获取通知栏高度通知栏高度写在dimen
- Stripe支付首页需要引用Stripe.net框架,我引用的是22.8.0版本,注意.NETFramework的版本为4.5,同时需要引用
- 布局布局效果如下,下面每个“网格”都是一个按钮,点击按钮,就会有相应的事件发生。由于UniformG
- 用注解实现Mybatis插入数据返回自增的主键Id我们在数据库表设计的时候,一般都会在表中设计一个自增的id作为表的主键。这个id也会关联到
- 环境与版本hibernate 版本:Hibernate 4.2.2 (下载后的文件名为hibernate-release-4.2.2.Fin
- Android手势解锁本文讲述的是一个手势解锁的库,可以定制显示隐藏宫格点、路径、并且带有小九宫格显示图,和震动!让你学会使用这个简单,高效
- 在上一篇实现了简单的画板功能, 这篇实现橡皮擦功能,首先分析一下应该如何实现,在Andriod有个图像混合(Xfermode)概念,利用这个
- 在使用c#进行控制IIS服务启动停止的时候,提示:【无法打开计算机“.”上的 IISADMIN 服务】这种情况是发生在像vista、win7
- 将通用算法放入具体类(HeapSorter),并将通用算法必须调用的方法定义在接口(HeapSorterHandle)中,从这个接口派生出D
- C#貌似没有专门用于ASCII码转字符或字符转ASCII码的系统函数,所以小编这里就借用一下强制类型转换来实现ASCII码与字符之间的互转。
- 在页面提交到tomcat乱码 解决方法是在tomcat/conf/server.xml中进行配置以tomcat6.0.32为例,需将以下代码
- 在使用WPF开发的时候就不免会遇到需要两个窗口间进行传值操作,当然多窗口间传值的方法有很多种,本文介绍的是使用委托实现多窗口间的传值。在上代
- 在项目中如果涉及到用Excel开发的报表模版来导出报表数据的话,一般都是在Excel报表中使用VBA做成宏来进行调用。即先使用Excel自带
- 在程序中对文件进行压缩解压缩是很重要的功能,不仅能减小文件的体积,还能对文件起到保护作用。如果是生成用户可以下载的文件,还可以极大的减少网络
- DSLDomain-specific language: 一种专注于某一领域,仅针对部分表达方式的计算机编程语言。特点方法链 Method
- 在 Effecitve Java 一书的第 48 条中提到了双重检查模式,并指出这种模式在 Java 中通常并不适用。该模式的结构如下所示:
- 承接上文 传送门一.完善登录功能按照常理,只有登陆过后才能进入首页,若没有登陆则应当直接跳转到登陆页面,这样的场景不就完美契合过滤器的功效吗
- 本文实例讲述了Spring的组合注解和元注解原理与用法。分享给大家供大家参考,具体如下:一 点睛从Spring 2开始,为了相应JDK 1.