【发布时间】:2020-11-26 18:55:49
【问题描述】:
我有 chainedTransactionManager 和两个不同的数据源。我的问题是 MydataSource1 实体在数据库中有一个唯一的约束违规。Mydatasource1.save 工作然后它传递给 mydatasource2.save 然后它抛出 HeuristicCompletionException 和 mydatasource2.save 工作而不是回滚。什么如果发生任何异常,我希望无条件回滚
> 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)
}
【问题讨论】:
-
您为什么不使用
saveAndFlush()而不是save(),这样在您到达MyDataSource2.Save(Entity2)之前,任何违反约束的行为都会提前发现 -
我已经尝试了 saveandflush 但还是一样,因为在我的场景中,约束是在 dblevel 而不是 applicationlevel
标签: spring-boot spring-data-jpa spring-transactions distributed-transactions