Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 试图理解为什么hibernate会出现锁超时异常_Java_Sql_Spring_Hibernate_Session - Fatal编程技术网

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

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 )

我正在用dao层更新我的业务层中的一个对象

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调用结果的第一个调用锁定