【问题标题】:Grails Pessimistic locking with executeUpdate()使用 executeUpdate() 进行 Grails 悲观锁定
【发布时间】:2011-05-27 12:25:03
【问题描述】:

我找不到任何关于如何在 grails 中通过 executeUpdate() 命令使用悲观锁定的信息。这可能吗?

[更新] 根据 Burt 的建议,这是我得到的查询结果。请注意,我使用了已弃用的 UPGRADE 而不是 PESSIMISTIC_WRITE,因为此选项不存在。

def session = sessionFactory.currentSession
def query = session.createQuery("UPDATE SensorProcessed s SET s.batch=:batch WHERE s.device.id=:deviceId AND s.batch.id=:batchId AND s.sensor.id=:sensorId AND s.rollupKey=:rollupKey")
    query.setLockMode ("s", LockMode.UPGRADE)
    query.setParameter("batch",ignored)
    query.setParameter("deviceId",device.id)
    query.setParameter("batchId",batch.id)
    query.setParameter("sensorId",sensor.id)
    query.setParameter("rollupKey",rollupKey)
    def updatedRows = query.executeUpdate()

谢谢,
亚伯拉罕。

【问题讨论】:

  • 你能描述一下你想要做什么吗?
  • 我在尝试更新时遇到过时对象异常,但很少见。我发现这通常发生在不同的服务更新同一个表时。我希望第二个服务用悲观锁更新它

标签: database grails pessimistic-locking


【解决方案1】:

它不受支持,但它很简单,可以访问 Hibernate API 并在那里使用它。将会话工厂的依赖注入添加到您的服务或控制器:

def sessionFactory

然后在您的方法中将 executeUpdate 调用替换为常规的 Hibernate 更新:

def session = sessionFactory.currentSession
def query = session.createQuery("your HQL")
query.setLockMode alias, LockMode.PESSIMISTIC_WRITE
// set query variable values
query.executeUpdate()

【讨论】:

  • Grails 的 LockMode 类中没有 PESSIMISTIC_WRITE,因此无法使用。有没有其他选择?升级够好吗?
  • 是的,很抱歉 - 在 1.3 中使用 UPGRADE,在 Hibernate 升级到 3.6 后,在 1.4 中它将是 PESSIMISTIC_WRITE。
【解决方案2】:

我刚看到这个:

http://grails.org/doc/latest/guide/single.html#5.3.5悲观和乐观锁定

请注意,您必须确保您的数据库支持悲观锁定。

【讨论】:

    猜你喜欢
    • 2015-03-24
    • 1970-01-01
    • 2013-12-07
    • 1970-01-01
    • 1970-01-01
    • 2015-04-09
    • 1970-01-01
    • 2010-09-12
    • 1970-01-01
    相关资源
    最近更新 更多