MySQL锁冲突排查解决

锁超时一般发生在两个事务内对同一行或者存在间隙锁的交集进行DML操作(insert update,delete)的情况下,在业务中一个事务持有锁之后因为发生了IO阻塞或者等待或者处理其他逻辑耗时导致事务一直没有被提交,锁得不到释放。

死锁时一般发生在两个事务分别先后持有两个不同的锁。比如事务1先持有A锁,事务2先持有B锁,事务1后准备持有B锁,事务2后持有A锁,那么这两个事务后面打算持有的锁都被对方先持有了,那么就出现了死锁。

MySQL中涉及到锁状态涉及到的命令:

-- 查看当前正在运行的进程(正在执行的sql)
show processlist;
-- 或
select * from information_schema.PROCESSLIST;
-- 查看数据锁定状态,8.0以上版本支持。
select * from performance_schema.data_locks;
-- 查看当前运行的所有事务信息
select * from information_schema.INNODB_TRX;
-- 根据进程号终止执行
kill ${processId}

排查流程:

-- 1.首先查询正在进行增删改操作的进程,查看执行的sql,判断是哪个表存在锁冲突。
select * from information_schema.PROCESSLIST where state = 'updating';

-- 2. 根据表名查询当前表内锁信息,判断被阻塞的sql获取的数据被哪个事务id锁住了
select * from performance_schema.data_locks where OBJECT_name = '表名';

-- 3. 根据事务id查询事务信息,判断事务是否有用,如果无用则kill
select *,trx_id,trx_state,trx_mysql_thread_id,trx_query from information_schema.INNODB_TRX where INNODB_TRX.trx_id = '事务id'

-- 如果无用的话就kill
kill processId

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