【问题标题】:mysql view not refreshing inside a transaction ( Hibernate/Spring)mysql 视图在事务中不刷新(Hibernate/Spring)
【发布时间】:2012-03-29 09:17:05
【问题描述】:

我使用 Spring 进行 DI 和 Hibernate 对 mySQL 数据库进行数据访问。我在事务中有代码,它在表中插入记录,然后执行查询该表并执行一些聚合计算的视图。我看到的问题是我刚刚在同一事务中插入的记录不包含在视图的计算值中。我在 mySQL 工作台中运行相同的视图,并且插入的值包含在视图中。有谁知道是什么原因造成的?

【问题讨论】:

    标签: java mysql spring hibernate sql-view


    【解决方案1】:

    很可能您还没有刷新对数据库的更改。 Hibernate 不知道您插入行的表和您稍后正在阅读的视图之间存在连接。在查询视图之前刷新实体管理器(或会话或模板)。

    【讨论】:

    • 刷新不起作用。我不得不调用 entityManager 上的 refresh 方法来刷新数据库中的更改。
    【解决方案2】:

    最终,我不得不调用 entityManager.refresh(Object entity) 来刷新我想要更新的视图记录的实体。我认为问题在于 Hibernate 无法识别需要更新视图,因为它不知道它(在数据库级别)依赖于已更新的原始实体。我认为 Hibernate 正在缓存视图中的记录,并且不知道它们需要更新,即使在 flush() 之后也是如此。

    Hibernate 认为原始表和视图完全不相关,而实际上视图依赖于表,并且在表更改时应该将其设置为“脏”。我不知道如何让 Hibernate 识别这一点。

    【讨论】:

    • 我想知道在从表中删除一些记录后使用会话和查询对象列表视图时如何做到这一点
    【解决方案3】:

    这很可能是由 MySQL 的默认隔离级别REPEATABLE READ 引起的。

    这意味着您在 MySQL Workbench 中的事务在您结束该事务之前不会看到更改。运行 SELECT 算作一个事务。

    在 MySQL Workbench 中发出提交(或回滚)后,您应该会看到更改。

    您可能希望将安装的默认隔离级别更改为 READ COMMITTED 或将 MySQL Workbench 中会话的隔离级别更改为 READ COMMITTED

    可以在手册中找到有关如何执行此操作的详细信息。

    【讨论】:

    • 试过 READ-COMMITTED 甚至 READ-UNCOMMITTED 都没有解决问题。
    猜你喜欢
    • 2015-11-09
    • 2011-06-13
    • 1970-01-01
    • 2020-09-18
    • 1970-01-01
    • 1970-01-01
    • 2011-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多