zoukankan      html  css  js  c++  java
  • org.springframework.dao.CannotAcquireLockException异常分析

    错误信息如下:

    2017-09-27 16:27:16.153 - 【com.ldyun.base.service.impl.BaseRetailOrderServiceImpl】 - 新增零售商品订单~org.springframework.dao.CannotAcquireLockException: 
    ### Error updating database.  Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction
    ### The error may involve com.ldyun.retail.mapper.RetailGoodsMapper.updateBySql-Inline
    ### The error occurred while setting parameters
    ### SQL: update retail_goods  SET stocks = stocks - CASE id  WHEN 83 THEN 1  END,saleCount = saleCount + CASE id  WHEN 83 THEN 1  END WHERE id IN (83)
    ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction
    ; SQL []; Lock wait timeout exceeded; try restarting transaction; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction~
    经过网上资料查询,原因为:Spring 事务嵌套造成死锁。

    经核实代码的确是service里面调用service,且两个service都配置了事务。顶层service名称为addRetailOrder,内层service名称为updateBysql。

    事务配置为:

    	<tx:advice id="txAdvice" transaction-manager="transactionManager">
    		<tx:attributes>
    			<tx:method name="add*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.Exception" />
    			<tx:method name="del*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.Exception" />
    			<tx:method name="update*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.Exception" />
    			<tx:method name="insert*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.Exception" />
    			<tx:method name="try*" propagation="REQUIRED" read-only="false" rollback-for="com.wm.base.exception.TransactionRollbackException" />
    		</tx:attributes>
    	</tx:advice>
    解决方法为:

    1、内层service实现方法配置@Transactional(propagation=Propagation.SUPPORTS)

    	@Override
    	@Transactional(propagation=Propagation.SUPPORTS)
    	public int updateBySql(String sql) {
    		// TODO Auto-generated method stub
    		return retailGoodsDao.updateBySql(sql);
    	}
    2、外层service不配置事务,即修改方法名称。

  • 相关阅读:
    学习:ASP.NET中App_Code,App_Data等文件夹的作用(转)
    总结:CLR Via C#(第九章):属性与索引器
    总结:CLR Via C#(第八章):其他(方法传递、out、ref)
    Init Version
    Code 128 Barcode Font Advantage Package 的常见问题
    Skelta Workflow.NET 2004 R2
    GTP.NET 甘特图项目管理控件
    Code 128 Barcode Font Advantage Package 中如何手动加入起始符,结束符,校验符
    VectorDraw Professional v5.1.1.1043
    开篇
  • 原文地址:https://www.cnblogs.com/archermeng/p/8587547.html
Copyright © 2011-2022 走看看