提交整个事务后,Hibernate是否刷新?

提交整个事务后,Hibernate是否刷新?,hibernate,flush,hibernate-entitymanager,Hibernate,Flush,Hibernate Entitymanager,我有两份申请 第一个应用程序将在一个while循环中持久化到数据库中,该循环将在很长时间(比如10-15分钟)后结束。 但是第二个应用程序需要第一个应用程序已经保存在数据库中的数据,第二个应用程序不能等待第一个应用程序完成。它将在第一个应用程序开始运行后立即启动。 我在第一个应用程序中使用了EntityManager.flush(),希望第一个应用程序能够立即将数据与数据库同步。这样,处于不同事务中的第二个应用程序可以开始处理数据 这不起作用,flush()方法的目的是什么,如何解决我的问题?请

我有两份申请 第一个应用程序将在一个while循环中持久化到数据库中,该循环将在很长时间(比如10-15分钟)后结束。 但是第二个应用程序需要第一个应用程序已经保存在数据库中的数据,第二个应用程序不能等待第一个应用程序完成。它将在第一个应用程序开始运行后立即启动。 我在第一个应用程序中使用了EntityManager.flush(),希望第一个应用程序能够立即将数据与数据库同步。这样,处于不同事务中的第二个应用程序可以开始处理数据

这不起作用,flush()方法的目的是什么,如何解决我的问题?请帮忙

flush()
将所有挂起的更改写入数据库。它执行insert、update和delete语句。它(默认情况下)在提交事务之前自动调用


但仅仅因为刷新了,并不意味着其他事务将看到这些更改。这取决于事务隔离级别,在大多数数据库中,事务隔离级别是只读提交的。事务彼此独立运行(I-in)。因此,如果您的隔离级别为READ_COMMITTED,则在提交此事务之前,第二个应用程序中的事务不会在第一个应用程序的事务中看到任何更改。

听起来您应该将第一个应用程序的工作拆分为单独的事务。更改通常仅在提交后对其他事务可见(如JB Nizet所述。您可以更改,但不应该更改)。

我将我的tx_隔离设置为值REPEATABLE-READ,这是上述场景中最合适的隔离级别。此外,我不想锁定其他事务读取和更新数据,我想要的是最新的值。然后你要么像Stefan建议的那样在几个TrnAction之间分割,或者您将数据库连接的隔离级别更改为READ_UNCOMMITTED。感谢您提到事务隔离层。我无法拆分事务,因为如果发生任何错误,我可能需要从一开始就回滚事务。这应该如何工作?当您回滚第一个事务,但第二个事务读取并处理数据时??嗯。。。我没有想过。然后,我没有其他解决方案,而不是拆分它。谢谢。