springcloud整合seata

网友投稿 239 2022-09-26

springcloud整合seata

springcloud整合seata

​​一、背景​​​​二、项目结构​​​​三、实现功能:​​​​四、项目使用到的技术​​​​五、整合步骤​​

​​1、引入spring-cloud-starter-alibaba-seata jar包​​​​2、涉及到的业务库操作​​

​​1、业务库需要存在 undo_log 表​​​​2、业务表主键​​​​3、页面中自动更新时间戳​​

​​3、开启数据源代理​​

​​1、自动配置数据源代理​​​​2、手动配置AT模式数据源代理​​

​​1、配置文件关闭自动数据源代理​​​​2、配置配置数据源​​

​​4、传递 xid​​​​5、事务分组和seata server对应上​​​​6、注册中心和配置中心​​​​7、业务方法加上@GlobalTransactional 注解​​

​​六、演示​​

​​分布式事务发生异常,事务回滚​​

​​七、完整代码​​​​八、参考文档​​

一、背景

在​​上一篇​​文章中,我们使用Seata整合了SpringBoot,在这篇文章中我们使用Seata整合SpringCloud。同时有了上一篇文章的基础,此处我们简单实现。

二、项目结构

三、实现功能:

完成用户下单操作,下单分为调用 账户服务 扣除余额,调用订单服务创建订单。

四、项目使用到的技术

Spring Cloud 、eureka、openfeign、seata 、nacos、druid、mybatis-plus

五、整合步骤

1、引入spring-cloud-starter-alibaba-seata jar包

com.alibaba.cloud spring-cloud-starter-alibaba-seata 2021.1 seata-spring-boot-starter io.seata io.seata seata-spring-boot-starter 1.4.2

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的值。

5、事务分组和seata server对应上

6、注册中心和配置中心

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); }}

六、演示

分布式事务发生异常,事务回滚

七、完整代码

​​2、​​seata常见问题​​

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Spring Cloud Gateway 网关限流
下一篇:Baby决定改变:不想孩子被人说,你妈妈做什么都不行!
相关文章

 发表评论

暂时没有评论,来抢沙发吧~