org.springframework.dao.CannotAcquireLockException异常分析

原创 2017年09月28日 09:49:53

错误信息如下:

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不配置事务,即修改方法名称。

相关文章推荐

Spring 开发笔记之 java.sql.SQLException: Lock wait timeout exceeded | CannotAcquireLockException 的解决

《Spring 开发笔记之 java.sql.SQLException: Lock wait timeout exceeded |  org.springframework.dao.CannotAcq...
  • defonds
  • defonds
  • 2012年03月14日 15:29
  • 17443

org.springframework.dao.CannotAcquireLockException解决

java.sql.SQLException: Lock wait timeout exceeded 该异常为一个service中调用了另一个service,两个service对同一表进行操作,造...

mysql数据库锁死,报错 mysql add/update error:org.springframework.dao.CannotAcquireLockException

在update数据很多的时候逐条update报错数据库表锁死: 报错: 严重: mysql add/update error:org.springframework.dao.CannotAcqui...

org.springframework.dao.CannotAcquireLockException

org.springframework.dao.CannotAcquireLockException 严重: mysql add/update error:org.springframework.d...

Mysql事物锁等待超时 Lock wait timeout exceeded; try restarting transaction

工作中同事遇到此异常,查找解决问题时,收集整理形成此篇文章。问题场景问题出现环境: 1、在同一事务内先后对同一条数据进行插入和更新操作; 2、多台服务器操作同一数据库; 3、瞬时出现高并发现象;...

周报9.19-9.25异常org.springframework.dao.InvalidDataAccessApiUsageException的处理

org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read...

hibernate异常:org.springframework.dao.InvalidDataAccessApiUsageException解决办法

org.springframework.dao.InvalidDataAccessApiUsageException: object references an unsaved transient i...

org.springframework.dao.InvalidDataAccessApiUsageException问题解决与分析

今天在撸代码过程中遇到一个异常,解决之后记录一下,希望给同样遇到这个问题的人一个思路,也给自己的粗心大意提个醒:org.springframework.dao.InvalidDataAccessApi...

The type org.springframework.dao.DataAccessException cannot be resolved. It is indirectly referenced

springMVC /jdbcTemplate
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:org.springframework.dao.CannotAcquireLockException异常分析
举报原因:
原因补充:

(最多只允许输入30个字)