Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 春季事务的传播是不稳定的_Java_Spring_Hibernate - Fatal编程技术网

Java 春季事务的传播是不稳定的

Java 春季事务的传播是不稳定的,java,spring,hibernate,Java,Spring,Hibernate,我有一个使用事务性服务的Spring/Hibernate应用程序,我对使用新传播时事务如何工作感到有点困惑: @Transactional method A() | |-loop for each element | |-@Transactional(propagation=Propagation.REQUIRES_NEW) method B() |-make some entity change and sav

我有一个使用事务性服务的Spring/Hibernate应用程序,我对使用新传播时事务如何工作感到有点困惑:

@Transactional
method A()
    |
    |-loop for each element
       |
       |-@Transactional(propagation=Propagation.REQUIRES_NEW)
         method B()
           |-make some entity change and save()
如你们所见,我有一个实体循环,每个实体都在一个单独的方法中处理,这个方法有新的事务。请确认我的假设:

  • 如果方法B中存在异常,那么当方法A返回时,在此方法中完成的所有更改都不应保存到DB中
  • 如果方法B中没有异常,则方法B中所做的更改将立即提交给DB,即使存在由方法a引起的父事务
  • 如果方法B中存在异常,那么当方法A返回时,在此方法中完成的所有更改都不应保存到DB中

    否,已在方法B中提交的更改将保持提交状态。例如,如果循环中有10个步骤,并且在步骤4中发生异常,则将保存在步骤1-3中所做的更改

    如果方法B中没有异常,则方法B中所做的更改将立即提交给DB,即使存在由方法a引起的父事务

    正是


    请确保使用Spring调用methodB(),而不仅仅是Java调用。最简单的方法是将methodB()放在另一个类中,与methodA()不同。另一种方法是使用@Resource注释,但它看起来有点棘手。

    答案很好。但是,如果在步骤4中发生异常并将其传播到父方法,从而导致父方法中断其自己的事务,那么会发生什么情况?即使父事务回滚,这些步骤1-3项是否会被保留?methodA中的事务不是父事务,它是另一个与methodB中的事务没有连接的事务。记住,你写了“传播。需要新的”。再次感谢,我将我的新问题提取到一个新的线程中。如果你在另一个类中创建这个方法并将它标记为REQUIRES_NEW,那么当你从当前类调用这个方法时,循环是否工作正常?我正在尝试这个,只有循环的迭代执行,然后它几乎停止了。为什么呢?你也面对过吗?