Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.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
Spring boot ChainedTransaction管理器引发HeuristicCompletionException,而不是回滚_Spring Boot_Spring Data Jpa_Spring Transactions_Distributed Transactions - Fatal编程技术网

Spring boot ChainedTransaction管理器引发HeuristicCompletionException,而不是回滚

Spring boot ChainedTransaction管理器引发HeuristicCompletionException,而不是回滚,spring-boot,spring-data-jpa,spring-transactions,distributed-transactions,Spring Boot,Spring Data Jpa,Spring Transactions,Distributed Transactions,我有chainedTransactionManager和两个不同的数据源。我的问题是MydataSource1实体在database.MydataSource1.save work中有一个唯一的约束冲突,然后它传递到mydatasource2.save,然后它抛出HeuristicCompletionException和mydatasource2.save work,而不是rollback。如果有任何条件,我想要回滚什么发生了什么样的异常 > org.springframework.tra

我有chainedTransactionManager和两个不同的数据源。我的问题是MydataSource1实体在database.MydataSource1.save work中有一个唯一的约束冲突,然后它传递到mydatasource2.save,然后它抛出HeuristicCompletionException和mydatasource2.save work,而不是rollback。如果有任何条件,我想要回滚什么发生了什么样的异常

> org.springframework.transaction.HeuristicCompletionException:
> Heuristic completion: outcome state is mixed; nested exception is
> org.springframework.dao.DataIntegrityViolationException: could not
> execute statement; SQL [n/a]; constraint [MYSchema.UNIQUE_NAME]; nested
> exception is org.hibernate.exception.ConstraintViolationException:
> could not execute statement\r\n\tat
> org.springframework.data.transaction.ChainedTransactionManager.commit(ChainedTransactionManager.java:177)\r\n\tat
> org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:619)\r\n\tat
> org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:372)\r\n\tat

@Transactional(rollbackFor = {Exception.class,Throwable.class}, isolation = Isolation.READ_COMMITTED, transactionManager = "MychainedTransactionManager", propagation = Propagation.REQUIRED)
        public void saveMultipleDBSource() 
    {
    ...........
    MyDataSource1.Save(Entity1)
    
    MyDataSource2.Save(Entity2)
    
    }

解决方法\u 1:

这里是一个似乎已经被分析、讨论和解决的问题 我建议您尝试一下&浏览整个线程,这与您的场景类似。 目前,你得到的是一个状态:state\u MIXED,而他得到的是一个状态:state\u roll\u BACK

解决方法\u 2:

您还可以在目标区域处理异常,因为您得到的异常是未检查的异常。 由于您的需求是明确的,如果您只想优雅地回滚,那么您可以尝试使用以下方法对此场景进行异常处理


我希望,这对你有所帮助。谢谢。:)

解决方法\u 1:

这里是一个似乎已经被分析、讨论和解决的问题 我建议您尝试一下&浏览整个线程,这与您的场景类似。 目前,你得到的是一个状态:state\u MIXED,而他得到的是一个状态:state\u roll\u BACK

解决方法\u 2:

您还可以在目标区域处理异常,因为您得到的异常是未检查的异常。 由于您的需求是明确的,如果您只想优雅地回滚,那么您可以尝试使用以下方法对此场景进行异常处理


我希望,这对你有所帮助。谢谢。:)

感谢您的回答,但是PROPAGATION.REQUIRES_NEW不能帮助我,仍然是相同的错误好的,您可以尝试使用提供的spring文档处理目标代码块周围的异常处理(解决方法2)吗。我不明白我已经在代码中添加了回滚异常和try-catch,但它没有命中。首先,您不需要显式指定rollboor={exception.class,Throwable.class},因为spring默认情况下会在发生错误时回滚事务。请参阅第12.5.3节回滚声明性事务删除@Transactional中的“rollbackFor”属性,然后围绕save()方法提供手动try-catch异常处理块(我认为应该覆盖并捕获异常)。我删除了回滚,没有任何更改。在我的情况下,try-catch帮不上忙,因为@transactional internal logic出现错误后,我无法捕捉到它们。谢谢您的回答,但PROPAGATION.REQUIRES\u NEW没有帮助我,仍然是相同的错误。好的,您可以尝试使用提供的spring文档处理目标代码块周围的异常处理(解决方法2)。我不明白我已经在代码中添加了回滚异常和try-catch,但它没有命中。首先,您不需要显式指定rollboor={exception.class,Throwable.class},因为spring默认情况下会在发生错误时回滚事务。请参阅第12.5.3节回滚声明性事务删除@Transactional中的“rollbackFor”属性,然后围绕save()方法提供手动try-catch异常处理块(我认为应该覆盖并捕获异常)。我删除了回滚,没有任何更改。在我的情况下,try-catch帮不上忙,因为@transactional internal logic出错后,我无法捕捉到它们,为什么您不执行
saveAndFlush()
而不是
save()
,这样在您到达
MyDataSource2.save(Entity2)
之前就可以捕捉到任何违反约束的情况,我已经尝试过saveAndFlush,但仍然一样,因为在我的场景中,CONTAINT在dblevel中,而不是在应用程序级别,为什么不执行
saveAndFlush()
而不是
save()
,所以在到达
MyDataSource2.save(Entity2)
之前,任何约束冲突都会被捕获,我已经尝试过saveAndFlush,但仍然是一样的,因为在我的场景中,containt在dblevel中,而不是applicationlevel中