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

@Transactional不能使用多个存储库调用

佘修为
2023-03-14

我有一个代码片段,看起来像这样

public class XService {
    private Repo1 repo1;
    private Repo2 repo2;
    private Repo3 repo3;

    XService(Repo1 repo1, Repo2 repo2, Repo3 repo3) {
        this.repo1 = repo1;
        this.repo2 = repo2;
        this.repo3 = repo3;
    }

    @Transactional(rollbackFor = Exception.class)
    public SomeObject method(Arg1 arg1, Arg2 arg2) {
        repo1.method1();
        repo2.method2();
        repo3.method3(); // probability of exception here, in which case rollback is needed
    }
}

public class YService {
    private XService xService;
  
    public YService(XService xService) {
        this.xService = xService;
    }
  
    public SomeObject method(Arg1 arg1, Arg2 arg2) {
        xService.method(arg1, arg2);
    }
}

配置类

@Configuration
public class ConfigurationClass {

    @Bean
    @Inject
    public PlatformTransactionManager transactionManager(DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean
    @Inject
    public DataSource dataSource() {
        // setting config properties here
        return new HikariDataSource(config);
    }

    @Bean
    @Inject
    public Repo1 repo1(JDBCTemplate template) {
      return new Repo1(template);
    }

    @Bean
    @Inject
    public Repo2 repo2(JDBCTemplate template) {
      return new Repo2(template);
    }

    @Bean
    @Inject
    public Repo3 repo3(JDBCTemplate template) {
      return new Repo3(template);
    }

    @Bean
    @Inject
    public XService XService(Repo1 repo1, Repo2 repo2, Repo3 repo3) {
      return new XService(repo1, repo2, repo3);
    }

    @Bean
    @Inject
    public YService YService(XService xService) {
      return new YService(xService);
    }
}

共有1个答案

卫君博
2023-03-14

使用TransactionTemplate并将我的repo调用包含在模板中是有效的。

transactionTemplate.execute(new TransactionCallbackWithoutResult() {
        @Override
        protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) throws TransactionException {
          repo1.method1();
          repo2.method2();
          repo3.method3();
        }
      });

我不知道这个起作用的原因。如果有人能帮助理解这背后的原因,那就太好了。

 类似资料:
  • 问题内容: 我有2个Mongodb数据库通过2个MongoTemplate-s连接到Spring Boot应用程序: mongoTemplate (默认的bean名称,连接到默认的db) mongoAppTemplate (在运行时连接到另一个数据库) 我有很多使用mongoTemplate的MongoRepository-,但我也想创建一些使用mongoAppTemplate的东西。 如何配置2

  • 我有两个Mongodb数据库连接到一个Spring Boot应用程序,其中有两个MongoTemplate-s: mongoTemplate(默认的bean名称,连接到默认的db) mongoAppTemplate(在运行时连接到另一个数据库) 我有很多使用mongoTemplate的MongoRepository,但我也想创建一些使用mongoAppTemplate的。 如何配置2 MongoR

  • 我正在尝试实现一个简单的REST服务,该服务基于具有Spring启动和Spring数据Rest的JPA存储库。(请参阅此教程)如果将以下代码与 gradle 一起使用,则运行良好: 为了让事情变得更简单,我使用Spring boot CLI(“Spring run”命令)尝试了相同的代码。 不幸的是,这似乎不起作用@RepositoryRestResource似乎无法像@RestControlle

  • 我试图执行带有子网的select语句,在存储库中使用带有'native query=true'的@query注释。但它给了我以下错误: psqlexception:error:“select”或“select”附近的语法错误 sub SELECT查询单独给出如下所示执行时的预期结果 上述查询的结果集是;RatingsAndReviews对象数组 所以我想要得到的是客户对特定“否”的评分。星星的。比

  • 我想使用Spring LDAP 设置多个 LDAP 存储库。我的目标是同时在所有存储库中创建或更新对象。 我使用LdapRepository Spring接口,我认为目前这是不可能的。 我想知道我是否可以创建自己的LdapRepository来扩展Spring,但是我不知道如何开始。 这是我的配置: 完整地说,一个存储库: 知道怎么做吗? 提前感谢任何帮助。

  • 问题内容: 我的Maven配置有一个小问题。此处的所有其他问题和答案都不能解决我的问题,因此,我开始了一个新问题。 我的问题是,我的Maven没有使用本地存储库。它总是从远程存储库中获取工件。 当下载工件或构建项目时,它将安装在本地存储库中,因此路径正确。 问题是:当我构建一个SNAPSHOT项目时,它仅安装在本地存储库中(应该是这样,不想每次都将其发布在我的关系上)。当我在pom.xml中构建另