MYSQL锁

锁类型

  • 共享锁和排他锁
    行级锁
    lock mode S:共享锁(读锁)
    lock mode X:排他锁(写锁)

  • 意向锁
    InnoDB支持多粒度锁定,允许行锁和表锁共存。为了使多粒度级别的锁定变得实用,InnoDB请使用意图锁。意向锁是表级锁,它指示事务稍后对表中的行需要哪种类型的锁(共享或独占)。有两种类型的意图锁:
    lock mode IS:意向共享锁
    lock mode IX:意向排他锁
    意图锁定协议如下:
    在事务可以获取表中行的共享锁之前,它必须首先获取IS表上的锁或更强的锁。
    在事务可以获取表中行的排他锁之前,它必须首先获取IX 表上的锁。
    下面的矩阵总结了表级锁类型的兼容性。

X IX S IS
X 冲突 冲突 冲突 冲突
IX 冲突 兼容的 冲突 兼容的
S 冲突 冲突 兼容的 兼容的
IS 冲突 兼容的 兼容的 兼容的

排他锁种类

  • 记录锁(RECORD LOCKS)
    记录锁是对索引记录的锁。例如, SELECT c1 FROM t WHERE c1 = 10 FOR UPDATE; 阻止任何其他事务插入、更新或删除值为 的t.c110
    记录锁总是锁定索引记录,即使定义的表没有索引。对于这种情况, InnoDB创建一个隐藏的聚集索引并将该索引用于记录锁定。请参阅 第 15.6.2.1 节,“聚集索引和二级索引”
    记录锁的事务数据在InnoDB 监视器 输出 SHOW ENGINE INNODB STATUS中 显示类似于以下内容:
RECORD LOCKS space id 58 page no 3 n bits 72 index `PRIMARY` of table `test`.`t`
trx id 10078 lock_mode X locks rec but not gap
Record lock, heap no 2 PHYSICAL RECORD: n_fields 3; compact format; info bits 0
 0: len 4; hex 8000000a; asc     ;;
 1: len 6; hex 00000000274f; asc     'O;;
 2: len 7; hex b60000019d0110; asc        ;
image.png
  • 间隙锁(Gap Locks)

  • 下一键锁(Next-Key Locks)
    lock

相互关系
X锁:不能有S或X锁
S锁:不能有X锁

多线程批量新增死锁场景;

https://www.jianshu.com/p/37518590053c

锁调试

  • 查看锁等待情况
    select * from innodb_lock_waits;
  • 查看相关锁信息
    SELECT * FROM innodb_locks;

insert加锁流程

执行 insert 语句,对要操作的页加 RW-X-LATCH,然后判断是否有和插入意向锁冲突的锁,如果有,加插入意向锁,进入锁等待;如果没有,直接写数据,不加任何锁,结束后释放 RW-X-LATCH;并加X锁;

死锁排查语句

select * from sys.innodb_lock_waits;
SELECT * FROM information_schema.innodb_locks;
SELECT * FROM information_schema.INNODB_TRX;
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;
SHOW OPEN TABLES where In_use > 0;
show engine innodb status;

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容