我正在更新业务层中的一个对象,dao层看起来像
String sql = "Update tbl_ExpenseTransaction set Status=:status where ExpenseTransactionID=:tranID";
getSessionCurrent().createSQLQuery( sql ).setString( "status", status.getIdValue() )
.setInteger( "tranID", tranId )
.executeUpdate();
在这次更新之后,下一个业务逻辑是调用另一个web服务,然后它再次更新ExpenseTransaction,此时我从hibernate得到一个锁超时异常,告诉我重新启动事务。我想知道.executeUpdate()
是否没有解除锁定?我在谷歌上搜索到sql将在更新期间锁定一行,这是有道理的,但我可以想象,在该语句运行后,它将被解锁,因此更新该对象的下一次调用将成功。
我尝试在执行更新后关闭当前会话,但立即失败,我们在所有地方都使用getSessionCurrent。
最终,我只想能够在同一事务中更新同一对象,并避免这种锁定超时。
edit:如果这有帮助的话,切换方法调用(更新对象的方法调用)的顺序似乎已经解决了这个问题。。还不知道为什么
无需关闭会话。尝试在调用executeUpdate()的位置开始/提交事务。您的webservice调用似乎又打开了一个事务来更新同一记录,但第一个事务等待webservice调用提交。
因此,第一个打开,更新记录并调用webservice(无需提交)。
Web服务试图更新相同的记录,但它被等待Web服务调用结果的第一个调用锁定。