Seata集成Mybatis-Plus解决多数据源事务问题

 更新时间:2023年11月01日 14:39:41   作者:吴名氏.  
当进行业务操作时,订单发生异常 ,进行了回滚操作,因为在不同的数据库实例中,余额却扣除成功,此时发现数据不一致问题,本文给大家介绍Seata集成Mybatis-Plus解决多数据源事务问题,感兴趣的朋友一起看看吧

1 前言

在使用单个服务,多数据源时,也存在分布式事务问题。

当单体系统需要访问多个数据库(实例)时就会产生分布式事务。 比如:用户信 息和订单信息分别在两个MySQL实例存储,用户管理系统删除用户信息,需要分别删除用户信息及用户的订单信 息,由于数据分布在不同的数据实例,需要通过不同的数据库链接去操作数据,此时产生分布式事务。 简言之:跨数据库实例产生分布式事务。

在这里插入图片描述

2 问题场景

参考此文档搭建一个多数据源项目Mybatis-Plus入门系列(19) -多数据源使用详解。

在插入订单数据时,模拟一个异常:

    @Override
    @DS("db_order")
    @Transactional
    public void insertOrder() {
        // 插入订单
        OrderTbl orderTbl = new OrderTbl();
        orderTbl.setUserId("12");
        orderTbl.setCommodityCode("IPHONE 13");
        orderTbl.setCount(1);
        orderTblMapper.insert(orderTbl);
        int i = 5 / 0;
    }

当进行业务操作时,订单发生异常 ,进行了回滚操作,因为在不同的数据库实例中,余额却扣除成功,此时发现数据不一致问题。

3 使用Seata 解决多数据源事务问题

3.1 集成Nacos Seata

参考该系列,给当前服务添加Nacos Seata 相关依赖,并启动Nacos Seata 。

3.2 多数据源集成Seata

多数据源集成Seata 时,主要是需要修改一下几个配置即可。

多数据源中,开启分布式事务,设置事务模式:

  datasource:
    # 多数据源
    dynamic:
      # 省略其他 
      # 开启分布式事务
      seata: true
      # 事务模式 为AT
      seata-mode: AT

seata 中,关闭数据源自动代理

seata:
  # 是否开启spring-boot自动装配,默认true,包括数据源的自动代理以及GlobalTransactionScanner初始化
  enabled: true
  # 是否开启数据源自动代理,默认开启
  enable-auto-data-source-proxy: false

3.3 测试

添加@GlobalTransactional注解。

    @GlobalTransactional
    @GetMapping("/test")
    public Object test() throws InterruptedException {
        accountTblService.reduceMoney();
        orderTblService.insertOrder();
        return "执行完毕!";
    }

测试发现,异常时,余额和订单服务都进行了回滚,集成成功。

到此这篇关于Seata集成Mybatis-Plus多数据源的文章就介绍到这了,更多相关Seata集成Mybatis-Plus多数据源内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java如何获取指定文件夹下的所有文件名

    java如何获取指定文件夹下的所有文件名

    这篇文章主要介绍了java如何获取指定文件夹下的所有文件名问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • java实现打印日历

    java实现打印日历

    这篇文章主要为大家详细介绍了java打印日历的实现代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-01-01
  • java JTree JCheckBox树复选框详解

    java JTree JCheckBox树复选框详解

    这篇文章主要为大家详细介绍了java JTree JCheckBox树复选框的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11
  • SpringBoot配置MyBatis-Plus实现增删查改

    SpringBoot配置MyBatis-Plus实现增删查改

    本文主要介绍了SpringBoot配置MyBatis-Plus实现增删查改,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • MyBatis使用级联操作解决lombok构造方法识别失败问题

    MyBatis使用级联操作解决lombok构造方法识别失败问题

    这篇文章主要介绍了MyBatis使用级联操作解决lombok构造方法识别失败问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • java wait()/notify() 实现生产者消费者模式详解

    java wait()/notify() 实现生产者消费者模式详解

    这篇文章主要介绍了java wait()/notify() 实现生产者消费者模式详解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • Java干货知识深入理解内部类

    Java干货知识深入理解内部类

    这篇文章主要介绍了Java干货知识深入理解内部类,定义在另一个类或方法中的类就叫做内部类,需要的朋友可以参考下
    2019-06-06
  • 最全面的JVM优化经验总结

    最全面的JVM优化经验总结

    这篇文章主要介绍了最全面的JVM优化经验总结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,,需要的朋友可以参考下
    2019-06-06
  • spring boot微服务自定义starter原理详解

    spring boot微服务自定义starter原理详解

    这篇文章主要介绍了spring boot微服务自定义starter原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • Java实现多个数组间的排列组合

    Java实现多个数组间的排列组合

    这篇文章主要为大家详细介绍了Java实现多个数组间的排列组合,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02

最新评论