java - 当我在同一个对象/表上使用 HQL 进行读取时,hibernate 为什么执行更新 sql 语句?

标签 java sql hibernate transactions locking

发生的情况是我正在读取一些记录,比如颜色 = 红色的汽车,它返回 10 辆汽车。然后我迭代这 10 辆汽车,并更新该汽车对象中的日期,即 car.setDate(5/1/2010)。然后我再次读取《汽车》中的颜色 = 绿色的内容。我打开了 sql 日志记录,我注意到当我调用 query.list() 时,它实际上会打印出一些更新语句到 Cars 表,并且我最终得到了锁等待超时。另请注意,这一切都是在单个数据库事务中完成的,因此我可以理解锁等待超时 - 似乎我在正在读取的表上有一个锁,并且在同一个事务中我试图更新它在我释放 table 上的锁之前。但似乎它不应该尝试运行 sql 来更新这些记录,直到我调用提交时事务结束?这都是使用 hibernate 的 HQL 来执行读取。我根本没有直接调用任何东西来进行保存,我只是在执行 car.setDate。

最佳答案

数据库写入由 session 上的 FlushMode 控制。默认情况下,hibernate 使用 FlushMode.AUTO,这允许它在认为合适的时候执行 session.flush()session.flush() 会导致 session 中未提交的数据写入数据库。在提交 session (或回滚)之前,将 session 数据刷新到数据库不会使其永久化。根据您的数据库表/行锁定策略,作为此事务的一部分已更新的行可能会被锁定以进行读或读/写访问。

我认为答案就在数据库中 - 您的表是否有支持您的用例的适当锁定策略?

关于java - 当我在同一个对象/表上使用 HQL 进行读取时,hibernate 为什么执行更新 sql 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6673785/

相关文章:

java - 使用 Java 字符串时的提示和技巧,以提高性能和安全性

mysql - 使用 GROUP BY 更新相关的所有记录

sql - 如何替换oracle中varchar2列中的重音字母

java - 如何使用 SQL 或 JPA 确定记录的层次结构

java - JPA父子关系

java - 如何获取实例变量的引用?

java - apache commons-lang 3.0 是否在任何 Maven 仓库中可用?

sql - hibernate ,SQL Server : How could I use default value as value from another column

java - Openjpa锁不起作用

mysql - NVL2功能不存在? mysql查询