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

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官方文档也没有更多的说明,搜索目前也更多是说多数据源问题,参考调整了下,有些直接没法起,有些结果还是一样,不是很懂这方面,有没有大佬能解答一下

阅读 1.1k
avatarAI BotBETA

在 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. 简化问题

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

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

1 个回答

尝试更换一下这个呢

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

image.png

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进