记一次mysql 锁表 的经历 : Lock wait timeout exceeded; try restarting transaction

场景:线程a 进行insert 操作,线程b 进行update 操作 。a 和b 都添加了事务。
报错:线程a insert 的时候 报锁等待超时

处理方式:
1。#查询是否锁表
show OPEN TABLES where In_use > 0;

2。#查询表被锁进程;查询到相应进程killid。
show full processlist

  1. #杀死相应的id
    kill id

4.# 查看进程状态
show engine innodb status

排查具体原因:什么情况下会造成锁表
1.大事务:如果一个事务 涉及大量的 数据新增,修改,插入,会占用表级锁,影响其他事务的的执行;
2.长事务:长时间执行的事务会持有锁资源,导致其他事务等待,增加锁表风险
3.无索引 或者无效索引 : 没有走索引,导致数据库操作效率低,会锁更多的表或者行
4.不同的锁级别:一个事务是表级别锁,一个是行级别锁,
可能会导致表竞争或者锁表的现象 ;

对于 索引 或者主键 操作来说,是行级别,其他的多是表级别
解决方法: 把 update 的条件语句添加索引字段

你可能感兴趣的:(mysql,数据库,java)