Java Spring@Transactional annotated on方法是否确保在方法结束时准确地刷新数据?
我在Spring应用程序中使用Java和Hibernate for persistence provider简化了escenario: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} 运行父方法时(未注释为事务性) 我是否可以确保当方法完成时,在调用该方法之前,数据库中的更改会受到影响? 或者,这些更改可能会在稍后刷新到数据库,但会有一些延迟 我
@Transactional
void method1() { // some savings}
@Transactional
void method2() { // some savings}
运行父方法时(未注释为事务性)
我是否可以确保当方法完成时,在调用该方法之前,数据库中的更改会受到影响?
或者,这些更改可能会在稍后刷新到数据库,但会有一些延迟
我对其他应用程序感兴趣,它们会在method1完成时(以及在调用method2之前)立即看到数据库中所做的更改
更新
我的父方法并没有在同一个类中定义,并且我的父方法的类和公司并没有@Transactional注释
谢谢 关于你的问题。。。确保在方法结束时准确刷新数据?不,不完全是方法结束的时间,但最晚是方法结束的时间
在事务中,可以根据需要多次刷新当前状态。刷新意味着将JPA会话与数据库同步。关于这一点,请参见。刷新并不意味着您的更改是持久的;如果事务稍后回滚,这些更改将自动恢复。提交操作执行不同的步骤,其中一个步骤是确保JPA(例如Hibernate)会话与DB同步,并在需要时调用flush。如果会话已同步,将跳过刷新
在您写的注释中,类和方法parentMethod
不是事务性的,并且method1()
和method2()
在单独的类中定义。在这种情况下,当调用method1()
时,将启动一个新事务。此方法结束时,将提交此事务。此方法对数据库所做的任何更改都将是持久的,即无论以后发生什么(异常、其他方法中的回滚),这些更改都将保留在数据库中
可以找到一些与您的案例相关的信息,因为以下信息很重要:
parentMethod
的类。如果它是事务性的,那么这两个调用将在现有事务中运行,并且在提交第一个调用后将没有提交parentMethod
不是事务性的,并且method1()
和method2()
在单独的类中定义。在这种情况下,当调用method1()
时,将启动一个新事务。此方法结束时,将提交此事务。此方法对数据库所做的任何更改都将是持久的,即无论以后发生什么(异常、其他方法中的回滚),这些更改都将保留在数据库中
可以找到一些与您的案例相关的信息,因为以下信息很重要:
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();
}