当前位置: 首页 > 知识库问答 >
问题:

mybatis-plus - SpringBoot2中集成Seata和Mybatis-plus以及多数据源,批量操作事务不兼容?

邵沛
2024-07-10

yaml核心配置如下(参考mp的dynamic的官方文档)

seata:
  enable-auto-data-source-proxy: false

spring:
  datasource:
    dynamic:
      primary: master
      strict: true
      #开启seata代理,开启后默认每个数据源都代理,如果某个不需要代理可单独关闭
      seata: true
      #支持XA及AT模式,默认AT
      seata-mode: AT

实现层代码如下(执行mp的批量)

@Log4j2
@Service
public class TestInfoCustom3541ServiceImpl extends ServiceImpl<TestInfoMapper, TestInfo> implements TestInfoService {

    @Override
    @GlobalTransactional(rollbackFor = Exception.class)
    public void doBatch() {
        List<TestInfo> addList = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            TestInfo testInfo = new TestInfo();
            testInfo.setTitle("批量测试标题-" + i)
                .setIsDeleted(true);
            addList.add(testInfo);
            # 单条执行(无事务)
            //this.save(testInfo);
        }
        # mp自带了 @Transactional(rollbackFor = Exception.class) 
        this.saveBatch(addList);
        throw new CustomClientException("主动抛出异常测试");
    }
}

在不增加额外配置的情况下,mp的批量操作一直都无法回滚,且日志中存在如下警告

 WARN-> union.system.test.service.impl.TestInfoCustom3541ServiceImpl.executeBatch[189]-> SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@749ad02c] Transaction not enabled

如果是单条单条的save,则不会有任何问题。基于seata,官方也说和ORM层框架是不会影响的。dynamic-datasource官方文档也没有更多的说明,搜索目前也更多是说多数据源问题,参考调整了下,有些直接没法起,有些结果还是一样,不是很懂这方面,有没有大佬能解答一下

共有2个答案

彭浩穰
2024-07-10

尝试更换一下这个呢

seata:
-  enable-auto-data-source-proxy: false
+  enableAutoDataSourceProxy: false 

image.png

彭梓
2024-07-10

在 Spring Boot 2 中集成 Seata、Mybatis-Plus 以及多数据源时,如果碰到批量操作事务不兼容的问题,很可能是由于事务代理配置不正确或者 Mybatis-Plus 批量操作的实现与 Seata 的事务管理不兼容。以下是一些可能的解决方案和检查点:

  1. 确保 Seata 客户端正确配置

    • 确保 Seata 服务端已经正确启动。
    • 检查 file.confregistry.conf 配置文件,确保 Seata 客户端能够正确连接到 Seata 服务端。
    • 在 Spring Boot 的 application.yml 中,确保 Seata 的相关配置正确,特别是 seata.enable-auto-data-source-proxyspring.datasource.dynamic.seata 的设置。
  2. 检查数据源代理

    • 如果设置了 seata.enable-auto-data-source-proxy: false,那么需要确保手动为每个数据源配置了 Seata 代理。
    • 如果使用 dynamic-datasource-spring-boot-starter,并且设置了 spring.datasource.dynamic.seata: true,理论上应该已经启用了数据源代理。
  3. 检查 Mybatis-Plus 的批量操作实现

    • Mybatis-Plus 的 saveBatch 方法可能并没有在内部使用 Seata 的事务管理。这可能需要查看 Mybatis-Plus 的源码来确定。
    • 如果 saveBatch 方法内部没有使用 Seata 的事务管理,那么可能需要自定义实现或者使用其他方式来确保批量操作在 Seata 的事务中执行。
  4. 自定义事务管理

    • 如果上述方法都无法解决问题,可以考虑自定义一个事务管理器,将 Mybatis-Plus 的批量操作包装在自定义的事务管理器中,以确保其在 Seata 的事务中执行。
  5. 检查日志和异常

    • 仔细查看日志和异常信息,看看是否有关于事务或数据源代理的更多线索。
    • 特别注意 Transaction not enabled 这样的警告信息,它可能指示了事务没有被正确开启或管理。
  6. 更新和同步依赖

    • 确保所有相关的依赖库都是最新版本,并且彼此兼容。
    • 特别注意 Seata、Mybatis-Plus 和 dynamic-datasource-spring-boot-starter 的版本兼容性。
  7. 参考官方文档和社区

    • 仔细阅读 Seata、Mybatis-Plus 和 dynamic-datasource-spring-boot-starter 的官方文档,看看是否有关于集成和配置的详细说明。
    • 在相关的社区和论坛中搜索类似的问题和解决方案。
  8. 简化问题

    • 尝试简化问题,例如只使用一个数据源而不是多数据源,看看是否能够正常工作。这有助于确定问题是否与多数据源相关。

请注意,由于我没有直接访问你的代码和环境,所以上述建议可能需要根据你的具体情况进行调整。希望这些建议能够帮助你解决问题。

 类似资料:
  • Mybatis-Plus 是一个 MyBatis 增强工具包,简化 CRUD 操作。 启动加载 XML 配置时注入单表 SQL 操作 ,为简化开发工作、提高生产率而生。 Maven 坐标 http://search.maven.org/#search%7Cga%7C1%7Cmybatis-plus     com.baomidou    mybatis-plus    maven 官方最新版本号为

  •   mybatis分页插件MicroPageInterceptor 特点: 1, 支持mysql和oracle分页 2, 不必在xml编写统计count的sql 3, 使用RowBounds子类PageInfo作为分页信息和记录总数的载体,不必像其他分页插件那样要求输入输出参数必须继承特殊父类。 4, 可在PageInfo中填写自定义排序sql串,提高查询性能和排序灵活性   jar已经提交mav

  • 1.介绍: MyBatis generator plus 基于mybatis-generator-core v.1.3.2 扩展,增加如下主要特性: 1.生成支持Oracle、Mysql、Sqlserver分页查询的代码: //分页查询demoOperateLogExample relationshipsExample = new OperateLogExample();relationships

  • 1. 前言 在spring-boot 集成 MyBatis小节中,我们介绍了如何在 spring-boot 中集成 MyBatis,MyBatis 虽然灵活,但是对于业务开发还略显不够。MyBatis-Plus 是国内开发者为 MyBatis 定制的一款增强工具,在不侵入 MyBatis 的基础上能够快速地提升 MyBatis 的开发能力,为开发者节省大量的时间。 提示: 本小节建立在spring

  • 本文向大家介绍Mybatis-Plus和Mybatis的区别详解,包括了Mybatis-Plus和Mybatis的区别详解的使用技巧和注意事项,需要的朋友参考一下 原文:https://blog.csdn.net/qq_34508530/article/details/88943858 . 区别一 如果Mybatis Plus是扳手,那Mybatis Generator就是生产扳手的工厂。 通俗来

  • 本文向大家介绍浅析Mybatis Plus和Mybatis的区别,包括了浅析Mybatis Plus和Mybatis的区别的使用技巧和注意事项,需要的朋友参考一下 区别一 如果Mybatis Plus是扳手,那Mybatis Generator就是生产扳手的工厂。 通俗来讲—— MyBatis:一种操作数据库的框架,提供一种Mapper类,支持让你用java代码进行增删改查的数据库操作,省去了每次

  • 本文向大家介绍springboot集成mybatis-plus遇到的问题及解决方法,包括了springboot集成mybatis-plus遇到的问题及解决方法的使用技巧和注意事项,需要的朋友参考一下 在使用spring boot集成mybatis-plus的过程中遇到的问题 如图, 首先我放xml的包的是没问题的,而是引入的架包和配置问题,问题配置如下 解决方法:请将mybatis-plus改成m

  • 本文向大家介绍mybatis-plus批处理IService的实现示例,包括了mybatis-plus批处理IService的实现示例的使用技巧和注意事项,需要的朋友参考一下 一、pom文件引入 二、Controller层 三、IService层(此处请确保继承的是 mybatisplus下的 IService,上述的UserInfoEntity为实体类) 四、ServiceImpl(UserIn