Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.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 Spring@Transactional annotated on方法是否确保在方法结束时准确地刷新数据?_Java_Spring_Hibernate_Jpa_Transactions - Fatal编程技术网

Java Spring@Transactional annotated on方法是否确保在方法结束时准确地刷新数据?

Java Spring@Transactional annotated on方法是否确保在方法结束时准确地刷新数据?,java,spring,hibernate,jpa,transactions,Java,Spring,Hibernate,Jpa,Transactions,我在Spring应用程序中使用Java和Hibernate for persistence provider简化了escenario: @Transactional void method1() { // some savings} @Transactional void method2() { // some savings} 运行父方法时(未注释为事务性) 我是否可以确保当方法完成时,在调用该方法之前,数据库中的更改会受到影响? 或者,这些更改可能会在稍后刷新到数据库,但会有一些延迟 我

我在Spring应用程序中使用Java和Hibernate for persistence provider简化了escenario:

@Transactional
void method1() { // some savings}

@Transactional
void method2() { // some savings}
运行父方法时(未注释为事务性)

我是否可以确保当方法完成时,在调用该方法之前,数据库中的更改会受到影响? 或者,这些更改可能会在稍后刷新到数据库,但会有一些延迟

我对其他应用程序感兴趣,它们会在method1完成时(以及在调用method2之前)立即看到数据库中所做的更改

更新 我的父方法并没有在同一个类中定义,并且我的父方法的类和公司并没有@Transactional注释

谢谢

关于你的问题。。。确保在方法结束时准确刷新数据?不,不完全是方法结束的时间,但最晚是方法结束的时间

在事务中,可以根据需要多次刷新当前状态。刷新意味着将JPA会话与数据库同步。关于这一点,请参见。刷新并不意味着您的更改是持久的;如果事务稍后回滚,这些更改将自动恢复。提交操作执行不同的步骤,其中一个步骤是确保JPA(例如Hibernate)会话与DB同步,并在需要时调用flush。如果会话已同步,将跳过刷新

在您写的注释中,类和方法
parentMethod
不是事务性的,并且
method1()
method2()
在单独的类中定义。在这种情况下,当调用
method1()
时,将启动一个新事务。此方法结束时,将提交此事务。此方法对数据库所做的任何更改都将是持久的,即无论以后发生什么(异常、其他方法中的回滚),这些更改都将保留在数据库中

可以找到一些与您的案例相关的信息,因为以下信息很重要:

  • 如果这些方法是否在同一类中,以及
  • 如果您使用Spring自己的AOP或AspectJ。此外,它还取决于定义
    parentMethod
    的类。如果它是事务性的,那么这两个调用将在现有事务中运行,并且在提交第一个调用后将没有提交
  • 对你的问题。。。确保在方法结束时准确刷新数据?不,不完全是方法结束的时间,但最晚是方法结束的时间

    在事务中,可以根据需要多次刷新当前状态。刷新意味着将JPA会话与数据库同步。关于这一点,请参见。刷新并不意味着您的更改是持久的;如果事务稍后回滚,这些更改将自动恢复。提交操作执行不同的步骤,其中一个步骤是确保JPA(例如Hibernate)会话与DB同步,并在需要时调用flush。如果会话已同步,将跳过刷新

    在您写的注释中,类和方法
    parentMethod
    不是事务性的,并且
    method1()
    method2()
    在单独的类中定义。在这种情况下,当调用
    method1()
    时,将启动一个新事务。此方法结束时,将提交此事务。此方法对数据库所做的任何更改都将是持久的,即无论以后发生什么(异常、其他方法中的回滚),这些更改都将保留在数据库中

    可以找到一些与您的案例相关的信息,因为以下信息很重要:

  • 如果这些方法是否在同一类中,以及
  • 如果您使用Spring自己的AOP或AspectJ。此外,它还取决于定义
    parentMethod
    的类。如果它是事务性的,那么这两个调用将在现有事务中运行,并且在提交第一个调用后将没有提交

  • @谢谢你!但这是一个不同的问题,具有不同的特点。这不是重复的问题。@mentalurg谢谢!但这是一个不同的问题,具有不同的特点。这不是一个重复的问题。谢谢,有两个问题:1)@Transactional(propagation=REQUIRES_NEW)应该“挂起”父事务,直到子事务完成(关于事务性javadoc),而不是强制提交2)您是否理解提交等同于刷新?我会更新问题,提供更多关于您提到的要点的详细信息1)是的,它将暂停外部交易。但是,当嵌套is方法完成时,它的事务将在外部事务恢复之前提交(或在出错时回滚)。即,在调用
    method2()
    之前,将提交用于
    method1()
    的事务。2) 有了commit,我的意思是改变将变得持久。无论之后发生什么,持久的更改都不会恢复。提交不等于刷新。即使不提交事务,也可以触发flush。但在执行提交时,如果需要,它也会触发刷新。谢谢您的回复!你知道当@Transactional方法完成时如何强制刷新吗?你不需要手动刷新,因为
    commit
    会帮你完成。谢谢,有两个问题:1)@Transactional(propagation=REQUIRES\u NEW)应该“挂起”父事务,直到子事务完成(关于事务javadoc),不是强制提交2)您是否将提交理解为刷新的等价项?我会更新问题,提供更多关于您提到的要点的详细信息1)是的,它将暂停外部交易。但是,当嵌套is方法完成时,它的事务将在外部事务恢复之前提交(或在出错时回滚)。即在<代码>方法之前
    void parentMethod() {
        method1();
        method2();
    }