记录一次MySql锁等待 (Lock wait timeout exceeded)异常

Java执行一个SQL查询未提交,遇到1205错误。

    java.lang.Exception:
    ### Error updating database.  Cause: java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction
解决办法:
执行mysql命令:

SELECT
 * 
FROM
  information_schema.innodb_trx;

然后找出trx_state值为“LOCK WAIT”的记录,根据记录中查询语句的系统id(trx_mysql_thread_id):kill掉被锁住的线程id

KILL trx_mysql_thread_id ;

产生原因:

当事务A对记录1进行更新或者删除操作的请求未commit时,另一个事务B也对记录1进行更新或者删除操作,此时事务B回等待前一个事务A提交事务,释放行锁,如果这个时间超过mysql设置的超时时间,则会产生“LOCK WAIT”事务。

应用举例:

当对某个方法断点时,此时如果重启服务,数据库则会产生未commit的事务,重启后的服务如果在执行相同的请求,对相同的数据库记录进行操作,此时产生的数据库事务会等待之前的事务commit。

针对这个问题,我的大牛同事(ZCJ)对这个问题产生的一点建议:

1、开始事务(使用@transtion)必须指定超时时间

@Transactional( rollbackFor = Exception.class , isolation = Isolation.REPEATABLE_READ, timeout = 30)

2、事务中 存在批量修改、删除的语句的时候,where 条件尽量加索引

3、事务中 存在批量修改、删除数据时,尽可能减少事务的执行时间

-- 事务信息查询

select * from information_schema.innodb_trx G;

-- 关闭事务 kill 线程ID

-- 锁等待查询

select * from information_schema.innodb_lock_waits G;

select * from information_schema.innodb_locks G;

以上原因仅为自己的猜测,没有经过实际测试,如有不妥之处还望指正!!!

参考:https://my.oschina.net/quanzhong/blog/222091

http://blog.itpub.net/29654823/viewspace-2150471/

 

 

 

  • 5
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值