mysql死锁线上快速排查方案

原因:

        多个sql session,因争夺资源,双方都在等待锁释放,这时候就会产生死锁。

mysql锁类型:

        共享锁、读锁、S锁: 多个事务对于同一数据可以共享一把锁,只能读不能写。
        排他锁、写锁、X锁:同时只能有一个事务可以获得,当数据被锁住,其他事务不能修改。

        意向锁 ix is
        事务A修改user表的记录r,会给记录r上一把行级的排他锁(X),同时会给user表上一把意向排他锁(IX),
        这时事务B要给user表上一个表级的排他锁就会被阻塞。意向锁通过这种方式实现了行锁和表锁共存且满足事务隔离性的要求。

例:     

t1:
        start transaction;
        select * from fenqu where id=30 for update;
        update test set code=30 where id=31;

t2:
        start transaction;
        select * from fenqu where id=31 for update;
        update test set code=31 where id=30;

t1 在锁住 30 后修改 31,t2 在锁住 31 后修改 30
此时因为30、31都被设置排他锁,都在等待对方释放,从而形成死锁

快速排查方案:

方案一:

扫描二维码关注公众号,回复: 15114876 查看本文章

        表查询

        mysql自带库 INFORMATION_SCHEMA 中有两个关于锁的表:
        INNODB_LOCKS :提供有关InnoDB 事务已请求但尚未获取的每个锁的信息,以及事务持有的阻止另一个事务的每个锁。
        INNODB_LOCK_WAITS:包含每个被阻止InnoDB 事务的一个或多个行,指示它已请求的锁以及阻止该请求的任何锁

        SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;

         事务id 249187被 id为 249119 锁阻止了

方案二:

        日志查询

        SHOW ENGINE INNODB STATUS;

        

方案三:

        如果使用阿里云服务;

        云数据库DAS -> 选择实例 ->实时性能 ->锁分析 -> 立刻诊断; 

        

猜你喜欢

转载自blog.csdn.net/weixin_56766616/article/details/127785994
今日推荐