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都被设置排他锁,都在等待对方释放,从而形成死锁

快速排查方案:

方案一:

        表查询

        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 -> 选择实例 ->实时性能 ->锁分析 -> 立刻诊断; 

        

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值