【问题标题】:Does Hibernate flush after the whole transaction is committed?提交整个事务后,Hibernate 是否刷新?
【发布时间】:2012-06-27 09:23:50
【问题描述】:

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

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

【问题讨论】:

    标签: hibernate flush hibernate-entitymanager


    【解决方案1】:

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

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

    【讨论】:

    • 我的 tx_isolation 设置为 REPEATABLE-READ 值,从上述情况来看,哪个隔离级别最合适。
    • 再说一次,我不想锁定其他事务读取和更新数据,我想要的是最新的值。
    • 然后,要么按照 Stefan 的建议拆分多个 trnsaction,要么将数据库连接的隔离级别更改为 READ_UNCOMMITTED。
    • 感谢您提及事务隔离层。
    【解决方案2】:

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

    【讨论】:

    • 我无法拆分我的交易,因为如果发生任何错误,我可能需要从头开始交易回滚..
    • 这应该如何工作?当你回滚第一个事务,但第二个已经读取数据并处理它??
    • 嗯……我没想到。然后,我没有其他解决方案,而是拆分它。非常感谢。
    猜你喜欢
    • 2015-11-09
    • 2020-09-18
    • 1970-01-01
    • 2017-04-10
    • 2015-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多