我正在更新业务层中的对象,其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。
最终我只想在同一个事务中更新同一个对象,并避免这种锁定超时。
编辑:如果这有帮助,切换方法调用的顺序(更新对象的顺序)似乎已经修复了问题..不知道为什么呢
答案 0 :(得分:0)
无需关闭会话。尝试开始/提交调用executeUpdate()的事务。看起来您的webservice调用再打开一个事务来更新相同的记录,但第一个事务等待webservice调用提交。
所以第一个打开,更新记录并调用webservice(不提交)。
webservice尝试更新相同的记录,但它被第一次等待webservice调用结果的调用锁定。