Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用@Transactional on service方法更新多个存储库_Java_Spring Boot_Spring Transactions - Fatal编程技术网

Java 使用@Transactional on service方法更新多个存储库

Java 使用@Transactional on service方法更新多个存储库,java,spring-boot,spring-transactions,Java,Spring Boot,Spring Transactions,Spring boot,postgres,Spring jpa 拥有一个服务,该服务试图跨多个存储库存储更改: 类服务{ @交易的 公共空间{ 报告1.删除(……); 报告2.saveAll(…); 报告1.保存(…); } } 如果任何操作失败,则需要回滚此操作 在这里,我突然想到两件事: 如果在该方法的中间添加一个“代码>抛出RunTimeExtExabor ,所有的东西都不会被回滚。 在有规律的流动中,我得到 无法提交JPA事务;嵌套异常为javax.persistence.Rollba

Spring boot,postgres,Spring jpa

拥有一个服务,该服务试图跨多个存储库存储更改:

类服务{
@交易的
公共空间{
报告1.删除(……);
报告2.saveAll(…);
报告1.保存(…);
}
}
如果任何操作失败,则需要回滚此操作

在这里,我突然想到两件事:

如果在该方法的中间添加一个“代码>抛出RunTimeExtExabor <代码>,所有的东西都不会被回滚。
  • 在有规律的流动中,我得到
  • 无法提交JPA事务;嵌套异常为javax.persistence.RollbackException:提交事务时出错

    我的配置是:

    @Configuration
    @EnableTransactionManager
    @EntityScan
    @EnableJpaRepositories
    public class DataConfig {}
    

    还尝试将
    TransactionTemplate
    bean与它的
    execute
    方法一起使用。设法克服第一个问题,但第二个问题仍然失败。

    您可以尝试添加
    @Transactional(rollboor=Exception.class)
    这将回滚,即使您的代码中有异常

    class Service {
    
        @Transactional(rollbackFor = Exception.class)
        public void doStuff() {
            repo1.delete(...);
            repo2.saveAll(...);
            repo1.save(...);
        }
    }
    

    您可以尝试添加
    @Transactional(rollboor=Exception.class)
    这将回滚,即使您的代码中存在异常

    class Service {
    
        @Transactional(rollbackFor = Exception.class)
        public void doStuff() {
            repo1.delete(...);
            repo2.saveAll(...);
            repo1.save(...);
        }
    }
    

    您使用的是SpringBoot,但是您的配置表明您正在努力解决SpringBoot自动配置问题。也就是说,这真的是您正在使用的代码,还是有一些最终的方法潜伏在您的周围?还有,您使用的是哪种数据库,而不是MySQL与MyISAM表(不支持事务)的偶然关系。如果“arround”指的是EntityScan和JpaRepositories注释,我使用它们将扫描半径减少到特定的包(如果我正确理解它们的用法)。对于DB-这是postgres。对于我正在使用的代码,我确实理解我在spring数据使用中采取了一种旁门左道,但这种方法是一种特殊情况。因此,是的,它是真实的,并且必须保持在相同的路径上。如果数据被持久化并且没有回滚,那么您的
    @Transactional
    将无法工作。此外,您在提交时出错的事实告诉您一些事情(请添加完整的stacktrace)。所以你一定在做一些你没说的事。同样提到的是,真实代码或伪代码被模拟成部分地模仿真实代码?(你不会是第一个也是最后一个这样做的人,并且在这方面犯了错误,结果一事无成!)。另外,您不需要
    @EnableTransactionManagement
    ,因为Spring Boot会处理这个问题。您在stacktrace部分是正确的。我没有意识到我正在进行一些jpa验证,而回滚异常的原因确实是一个验证错误。对于
    @Transactional
    ,是的,它不起作用。造成这种情况的原因是,使用同一个bean中的
    initializebean
    测试流是一个坏主意。将删除
    TransactionManager
    ,谢谢。您正在使用Spring Boot,但是您的配置表明您正在努力解决Spring Boot自动配置问题。也就是说,这真的是您正在使用的代码,还是有一些最终的方法潜伏在您的周围?还有,您使用的是哪种数据库,而不是MySQL与MyISAM表(不支持事务)的偶然关系。如果“arround”指的是EntityScan和JpaRepositories注释,我使用它们将扫描半径减少到特定的包(如果我正确理解它们的用法)。对于DB-这是postgres。对于我正在使用的代码,我确实理解我在spring数据使用中采取了一种旁门左道,但这种方法是一种特殊情况。因此,是的,它是真实的,并且必须保持在相同的路径上。如果数据被持久化并且没有回滚,那么您的
    @Transactional
    将无法工作。此外,您在提交时出错的事实告诉您一些事情(请添加完整的stacktrace)。所以你一定在做一些你没说的事。同样提到的是,真实代码或伪代码被模拟成部分地模仿真实代码?(你不会是第一个也是最后一个这样做的人,并且在这方面犯了错误,结果一事无成!)。另外,您不需要
    @EnableTransactionManagement
    ,因为Spring Boot会处理这个问题。您在stacktrace部分是正确的。我没有意识到我正在进行一些jpa验证,而回滚异常的原因确实是一个验证错误。对于
    @Transactional
    ,是的,它不起作用。造成这种情况的原因是,使用同一个bean中的
    initializebean
    测试流是一个坏主意。将删除
    TransactionManager
    ,谢谢。这是我的第一个方法,但问题是-我抛出了
    RuntimeException
    ,根据
    @Transactional.rollboor
    ,默认情况下会捕获它。我确实设法找到了问题的路径,这与AOP更相关-
    @Transactional
    如果在同一个bean中调用,则无法解决(我使用
    InitializationBean
    接口来测试流)。这是我的第一种方法,但问题是-我抛出了
    RuntimeException
    ,这,根据
    @Transactional.rollboor
    ,默认情况下会捕获。我确实设法找到了问题的路径,它与AOP更为相关-
    @Transactional
    如果在同一个bean中调用,则不会得到解决(我使用
    InitializationBean
    接口来测试流)。