gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 15:48:19 27 4
gpt4 key购买 nike

发生的情况是我正在读取一些记录,比如颜色 = 红色的汽车,它返回 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com