2011-05-27 62 views
0

我找不到有关如何在grails中使用executeUpdate()命令的悲观锁定的任何信息。这可能吗?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() 

谢谢
亚伯拉罕。

+0

你能描述你想要什么去做? – 2011-05-27 15:20:15

+0

尝试执行更新时,我收到了过时的对象异常,但只是很少。我发现这通常发生在一个不同的服务更新同一个表时。我希望这第二项服务用悲观锁更新它 – Abe 2011-05-28 07:46:51

回答

1

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

def sessionFactory 

,然后在你的方法取代常规的Hibernate更新的executeUpdate电话:

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

PESSIMISTIC_WRITE不在Grails中的LockMode类中,因此无法使用。有没有其他的选择? UPGRADE足够好吗? – Abe 2011-05-28 09:30:11

+0

是的,对不起 - 在1.3中使用UPGRADE,在1.4中将PESSIMISTIC_WRITE与Hibernate升级到3.6。 – 2011-05-28 18:17:22