首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多JPA事务内部方法

多JPA事务内部方法
EN

Stack Overflow用户
提问于 2019-12-04 08:13:35
回答 1查看 94关注 0票数 0

我有一个例子,它需要回滚一些方法内部的for循环,通过条件外部循环。我使用EntittyManager和@Transactional。因为循环中的逻辑是复杂的,所以我不想把它带入2个循环。如何实现回滚,提交?

代码语言:javascript
复制
@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)
     }
EN

回答 1

Stack Overflow用户

发布于 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()上的事务进行自我注入才能工作。如下所示

代码语言:javascript
复制
         @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行为的内容

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59167221

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档