我有一个例子,它需要回滚一些方法内部的for循环,通过条件外部循环。我使用EntittyManager和@Transactional。因为循环中的逻辑是复杂的,所以我不想把它带入2个循环。如何实现回滚,提交?
@Service
@Transactional
public class StudentServiceImpl implement StudentService {
@Transactional(propagation = Propagation.REQUIRES_NEW)
public boolean execute(List<ADto> adtoList) {
boolean a = true;
for(ADto dto : adtoList) {
boolean a = method1(dto); // call to sub method2, method3 to insert data into A, B table
if(a == false) {
break;
}
method4(); // do insert data into D, E table
method5(); // do update into F table
}
if(a == false) {
// need rollback all inserted data in A, B table which is inserted in method1, method2, method3 (of all loop element)
// still commit all inserted data at method4(), method5() (of all loop element)
}发布于 2019-12-04 09:29:20
从问题陈述看,
method1()、method2()和method3()调用应在当前txn内操作。
method4()和method5()应该在各自独立的txn上操作。
当method1()返回false时,将执行中断,并且RuntimeException将回滚通过method1()事务插入的任何内容。
method4()和method5()数据将被持久化,因为它们是在它们自己的独立事务中。
阅读更多信息
PROPAGATION_REQUIRES_NEW = 3;如果已经为方法M1启动了DataSourceTransactionObject T1并且它正在进行(正在执行方法M1),并且另一个方法M2开始执行,则在方法T1使用新的DataSourceTransactionObject T2 .If M2.M2在其自己的事务上下文中运行的持续时间内,T1被挂起
还要注意,自调用(目标对象内的方法调用)不会导致事务。您需要对method4()和method5()上的事务进行自我注入才能工作。如下所示
@Service @Transactional
public class StudentServiceImpl implements StudentService {
@Autowired
private StudentService self; //self injection ;
@Transactional(propagation= Propagation.REQUIRES_NEW)
public boolean execute(List<ADto> adtoList) {
boolean a = true;
for(ADto dto : adtoList) {
boolean a = method1(dto); // uses the current txn.
if(a == false) {
break;
}
self.method4(); // do insert data into D, E table
self.method5(); // do update into F table
}
if(!a) {
throw new RuntimeException("Rollback Txn for method1");
}
}
@Transactional(propagation= Propagation.REQUIRES_NEW)
public void method4() {
}
@Transactional(propagation= Propagation.REQUIRES_NEW)
public void method5() {
}
}method4()和method5()用@Transactional(propagation = Propagation.REQUIRES_NEW)注释并在代理上调用
还可以阅读https://www.byteslounge.com/tutorials/spring-transaction-propagation-tutorial文章中关于REQUIRES_NEW行为的内容
https://stackoverflow.com/questions/59167221
复制相似问题