2011-05-27 56 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