mysql 锁表查看
查看最后的锁信息
show ENGINE INNODB status
1、查看当前有无锁等待
show status like 'innodb_row_lock%';
2、查看哪个事务在等待(被阻塞了)
select * from information_schema.INNODB_TRX WHERE trx_state='LOCK WAIT'
trx_state 表示该事务处于锁等待状态。
trx_query : 当前被阻塞的操作是select * from actor where actor_id=1 for update。
从trx_mysql_thread_id和trx_id可以看到这里查到当前被阻塞的事务的:
线程ID是 971,注意说的是线程id
3、查询该事务被哪个事务给阻塞了 从innodb_trx获取到被阻塞的trx_id是3934,阻塞该事务的事务id是3933
SELECT * FROM performance_schema.threads WHERE processlist_id=970
4、根据trx_id,从innodb_trx表可查询到trx_mysql_thread_id线程id为970
select * from information_schema.innodb_trx where trx_id=3933
5、根据线程id,查询表拿到thread_id为995
SELECT * FROM performance_schema.threads WHERE processlist_id=970
6、根据thread_id,查询当前锁源的sql
SELECT * FROM performance_schema.events_statements_current WHERE thread_id=995
整个流程如下:
(1)首先查询是否有锁,根据锁查到被锁的trx_id
(2)根据被锁的trx_id可以查到锁源的trx_id
(3)根据锁源的trx_id查到trx_mysql_thread_id
(4)再根据trx_mysql_thread_id查到thread_id
(5)最后,用thread_id查找到锁源的sql
参考:https://blog.csdn.net/qq_41588098/article/details/130888704
MySQL死锁排查
如果当前有锁等待情况,如何发现源头是哪个事务?怎么处理?
答:
1)查看当前事务中是否有锁信息:
select trx_id,trx_state,trx_started,trx_requested_lock_id,trx_weight from innodb_trx;
2)查看锁信息(表锁or行锁,锁的那张表)
select lock_id,lock_trx_id,lock_mode,lock_type,lock_table,lock_index from innodb_locks;
3)查看锁在等待那些事务
select * from innodb_lock_waits;
如何避免死锁发生
减小事务的大小,尽量分割。
mysql 默认隔离级别是 可重复读,会产生间隙锁,增加死锁的概率,对应解决方法,修改为 提交读级别,此时binlog日志格式必须设置为 ROW 避免产生主从数据不一致。
查看具体产生死锁的sql,优化sql 避免产生全表扫描,该加索引加索引。

浙公网安备 33010602011771号