试图理解为什么我在使用hibernate获取锁定超时异常

时间:2016-01-12 00:41:47

标签: java sql spring hibernate session

我正在更新业务层中的对象,其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。

最终我只想在同一个事务中更新同一个对象,并避免这种锁定超时。

编辑:如果这有帮助,切换方法调用的顺序(更新对象的顺序)似乎已经修复了问题..不知道为什么呢

1 个答案:

答案 0 :(得分:0)

无需关闭会话。尝试开始/提交调用executeUpdate()的事务。看起来您的webservice调用再打开一个事务来更新相同的记录,但第一个事务等待webservice调用提交。

所以第一个打开,更新记录并调用webservice(不提交)。

webservice尝试更新相同的记录,但它被第一次等待webservice调用结果的调用锁定。