试图理解为什么hibernate会出现锁定超时异常



我正在更新业务层中的一个对象,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服务调用结果的第一个调用锁定。

最新更新