使用@Transactional 时,我在回滚事务方面遇到一些问题。我有以下代码:
@Transactional
public class A{
@Resource
Object obj;
public void insertMultiTable(){
for(Item item:items){
try{
obj.insertTableA();
obj.insertTableB();
} catch(Exception e){
// do somethings...
}
}
}
}
如您所见,我将执行 insertTableA 和 insertTableB,当两者都完成时我的过程就成功了。我有第一次和第二次就成功了。但在第三次,insertTableB将抛出异常,我只想回滚这个循环,第一次和第二次已插入数据库。我怎样才能做到呢?请帮忙...
最佳答案
将您的逻辑移至另一个服务并使用 @Transactional(propagation = Propagation.REQUIRES_NEW) 标记
这将使每个循环事务都是独立的。 (IE:第三个循环抛出异常只会回滚第三个循环,保留第一个和第二个循环结果已提交)
public class SubA {
@Resource
Object obj;
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void insert(Item i) {
try{
obj.insertTableA();
obj.insertTableB();
} catch(Exception e){
// do somethings...
}
}
}
现在在您的 A
类中调用此服务
@Transactional
public class A{
@Resource
SubA subA;
public void insertMultiTable(){
for(Item item:items){
subA.insert(item);
}
}
}
关于java - @事务回滚循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50821235/