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