【问题标题】:Hibernate update query confusionHibernate 更新查询混淆
【发布时间】:2016-05-16 11:32:28
【问题描述】:

我正在运行具有多个线程的 java 应用程序,这些线程将从 oracle 数据库中查询,如果满足条件,它将更新行。但是很有可能多个线程在一行中获得相同的状态,然后多个线程尝试更新同一行。

假设任何行的状态为“ACCEPTED”,然后将其更新为“PROCESSING”状态,然后开始处理,但处理应仅由更新此记录的一个线程完成。

一种方法是我查询数据库,如果状态是“接受”然后更新记录,我需要编写同步的 java 方法,但这会阻塞多线程。所以我想针对这种情况使用sql方式。

Hibernate 更新方法返回类型为 void。因此,我无法找到 row 是现在更新还是已经更新。在这种情况下,是否有任何 Select for Update 或休眠中的任何锁定东西可以帮助我。

【问题讨论】:

    标签: java hibernate oracle-sqldeveloper hibernate-criteria


    【解决方案1】:

    您可以通过@Version 很好地使用乐观锁定。

    请看下面的帖子:

    Optimistic Locking by concrete (Java) example

    【讨论】:

      【解决方案2】:

      我认为您的问题与How to properly handle two threads updating the same row in a database有关

      除此之外,我想在@shankarsh 提供的答案之上说,如果您想使用查询而不是实体管理器或休眠会话,您需要在查询中包含版本字段,如下所示:

      update t.columntoUpdate,version = version + 1 from yourEntity where yourcondition and version = :version
      

      这样更新只会针对特定版本成功,并且所有并发更新都不会更新任何内容。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-01
        • 2016-01-19
        • 1970-01-01
        • 1970-01-01
        • 2013-09-24
        • 1970-01-01
        相关资源
        最近更新 更多