Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction

2019-06-24 09:34:00
admin
原创
91
摘要:Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction

Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction

1、记录一次死锁的经历,自己写了一个方法测试一下死锁

出现死锁是因为不了解事物的隔离级别

* 保证同一个事务中 
PROPAGATION_REQUIRED 支持当前事务,如果不存在 就新建一个(默认) 
PROPAGATION_SUPPORTS 支持当前事务,如果不存在,就不使用事务 
PROPAGATION_MANDATORY 支持当前事务,如果不存在,抛出异常 
* 保证没有在同一个事务中 
PROPAGATION_REQUIRES_NEW 如果有事务存在,挂起当前事务,创建一个新的事务 
PROPAGATION_NOT_SUPPORTED 以非事务方式运行,如果有事务存在,挂起当前事务 
PROPAGATION_NEVER 以非事务方式运行,如果有事务存在,抛出异常 
PROPAGATION_NESTED 如果当前事务存在,则嵌套事务执行
下面是我的一段代码


@Transactional(rollbackFor = Exception.class)
	@Override
	public void test() {
		Goods goods=auGoodsDao.queryObject(1);
		goods.setName("11111");
		auGoodsDao.update(goods);
		goodsPhotoService.test1();
	} 


@Override
	@Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRES_NEW)
	public void test1() {
		Goods goods=auGoodsDao.queryObject(1);
		goods.setName("11111");
		auGoodsDao.update(goods);
	}
此时是因为我操作了同一条数据,而且我是嵌套事物,另外一个事物新建一个事物,挂起了当前事物,导致数据出现了死锁,如果把propagation = Propagation.REQUIRES_NEW就可以了,

发表评论
评论通过审核之后才会显示。
文章分类
联系方式
联系人: 郑州-小万
电话: 13803993919
Email: 1027060531@qq.com
QQ: 1027060531
网址: www.wanhejia.com