美文网首页
解决CannotAcquireLockException

解决CannotAcquireLockException

作者: 刹那真实 | 来源:发表于2019-04-02 16:33 被阅读0次

    一大早实施同事找,说是系统业务异常。查看日志,发现有数据库死锁的问题。

    org.springframework.dao.CannotAcquireLockException: PreparedStatementCallback; 
    SQL [insert into pla_common(common_key,common_value,stint,url) values(?,?,?,?)]; 
    Lock wait timeout exceeded; try restarting transaction; 
    nested exception com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException:
     Lock wait timeout exceeded; try restarting transaction
    

    于是根据度娘指引,查数据库死锁。可查来查去,数据库一切正常,没有死锁!发现这问题已经超纲,就联系了DBA同事,DBA用root用户查,还是一切正常。遂怀疑是程序的问题,与数据库无关。
    抱着试试看的态度,查了下CannotAcquireLockException这个异常,才发现可能是事务嵌套的问题。
    果然在代码中发现了一个service中调用了两次包含insert操作的方法。

    result = saveCommitApply((boolean)getUrl(formMap).get("isOutRreach"),getUrl(formMap).get("url").toString(),formMap);
    

    在getUrl中有涉及数据库insert的操作,此处将getUrl调用了两次。相当于在一个事务中,对同一张表进行了两次insert。第一个未提交,也就未释放锁,第二个insert等待锁超时,就抛出了CannotAcquireLockException异常。

    修改后:

     Map<String,Object> url = getUrl(formMap);
     result = saveCommitApply((boolean)url.get("isOutRreach"),url.get("url").toString(),formMap);
    

    相关文章

      网友评论

          本文标题:解决CannotAcquireLockException

          本文链接:https://www.haomeiwen.com/subject/dkigbqtx.html