MySQL锁冲突排查解决

文章讲述了MySQL中锁超时和死锁的情况,以及如何通过查询`PROCESSLIST`,`data_locks`和`INNODB_TRX`等系统表来诊断和解决这类问题。锁超时通常发生在并发事务对同一数据进行DML操作时,而死锁则涉及两个事务互相等待对方释放资源。排查流程包括查找更新中的进程,分析锁状态和事务信息,必要时终止无用的事务。
摘要由CSDN通过智能技术生成

锁超时一般发生在两个事务内对同一行或者存在间隙锁的交集进行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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值