事务没有使用2个Transaction实例和嵌套方法回滚



我需要在多个表中插入记录,但这些表属于不同的模式,因此事务值也不同。但我想在所有表中原子地插入记录(要么全部插入,要么不插入(。以下代码我已尝试处理此问题。

@Transactional(value = "First")
public void insert(String f1, String f2, String f3, String f4){
try {
Entity1 entity1 = createEntity1(f1);
FirstTable1.insert(entity1);
insertInSecondSchema(f2, f3, f4);
}
catch (Exception e){
String errorMessage = "Error occur while inserting in first schema";
logger.error(errorMessage, e);
throw new CustomException(errorMessage,e);
}
}
@Transactional(value = "second")
private void insertInSecondSchema(String f2, String f3, String f4) {
try {
Entity2 entity2 = createEntity2(f2);
SecondTable2.insert(entity2);
Entity3 entity3 = createEntity3(f3);
SecondTable3.insert(entity3);
Entity4 entity4 = createEntity4(f4);
SecondTable4.insert(entity4);
}
catch (Exception e){
String errorMessage = "Error occur while inserting in second schema";
logger.error(errorMessage, e);
throw new CustomException(errorMessage,e);
}
}

在这种情况下,如果在SecondTable3中插入时发生错误。SecondTable2未回滚,但FirstTable1已回滚。我在secondMethod中尝试了许多传播级别,但都不适用。请帮助我如何使用相同的代码或其他代码结构来解决这个问题。

在这种情况下,我认为最好将其视为分布式系统。在这种情况下,您不能使这些插入成为事务性的,相反,您应该在其中一个事务成功而另一个事务失败的情况下使用补偿操作。

在您的情况下,如果insertInSecondSchema失败,那么您必须为第一个模式调用相同记录的delete,因此结果就像第一次插入从未发生过

最新更新