MySQL InnoDB 锁概述

行级锁

  1. 共享锁(S锁):也叫读锁(在进行排他读的时候实际上加的是排他锁,也就是下面的写锁。读锁和写锁这种叫法其实并不准确,建议就叫共享锁)。加锁成功后允许事务读一行记录,其他事务可同时获取S锁。
  2. 排他锁(X锁):也叫写锁。加锁成功后允许事务更新或删除一行记录,其他事务不能获取锁。
  3. 插入意向锁(Insert Intention Lock):插入一行记录时,如果插入位置被加了Gap锁,则在Gap锁处加上插入意向锁,但不会阻止其他锁获取。
  4. 隐式锁:事务T1插入一行记录,事务T2立刻修改这行记录,事务T2会给这行记录加锁,然后事务T2进入等待状态。

行级锁算法

  1. 记录锁(Record Lock):锁住单行记录。
  2. 间隙锁(Gap Lock):锁住行记录之间的间隙,不包括行本身,用于防止幻读。数据页中有两个最大最小值隐藏列,用于锁无限大范围的情况。
  3. 临键锁(Next-Key Lock):是记录锁+间隙锁,锁住行记录之间的间隙,包括行本身。

表级锁

  1. 意向锁(Intention Lock):获取表锁前,需要先加意向锁,意向锁可以快速判断表中的记录是否被上锁。有意向共享锁(IS锁)和意向排他锁(IX锁)。
  2. 自增长锁(AUTO-INC Locking):保障AUTO_INCREMENT属性的列自增。
  3. 元数据锁(MDL):Metadata Lock,执行DDL语句时加的表锁,DDL语句执行时会隐式的提交当前会话中的事务。

锁结构

加锁的本质就是在内存中创建一个锁结构与行记录关联。

锁结构中包含:

  • 索引信息:对于行锁,需要记录锁属于哪个索引。
  • 表锁信息:属于哪个表。
  • 行锁信息:记录所在的表空间、页号。
  • 锁模式:S锁、X锁、IS锁、IX锁。
  • 锁类型:行锁、表锁。
  • 锁具体类型:Record锁、Gap锁、插入意向锁等
  • 等待状态:锁是否加成功。

 

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值