行级锁
- 共享锁(S锁):也叫读锁(在进行排他读的时候实际上加的是排他锁,也就是下面的写锁。读锁和写锁这种叫法其实并不准确,建议就叫共享锁)。加锁成功后允许事务读一行记录,其他事务可同时获取S锁。
- 排他锁(X锁):也叫写锁。加锁成功后允许事务更新或删除一行记录,其他事务不能获取锁。
- 插入意向锁(Insert Intention Lock):插入一行记录时,如果插入位置被加了Gap锁,则在Gap锁处加上插入意向锁,但不会阻止其他锁获取。
- 隐式锁:事务T1插入一行记录,事务T2立刻修改这行记录,事务T2会给这行记录加锁,然后事务T2进入等待状态。
行级锁算法
- 记录锁(Record Lock):锁住单行记录。
- 间隙锁(Gap Lock):锁住行记录之间的间隙,不包括行本身,用于防止幻读。数据页中有两个最大最小值隐藏列,用于锁无限大范围的情况。
- 临键锁(Next-Key Lock):是记录锁+间隙锁,锁住行记录之间的间隙,包括行本身。
表级锁
- 意向锁(Intention Lock):获取表锁前,需要先加意向锁,意向锁可以快速判断表中的记录是否被上锁。有意向共享锁(IS锁)和意向排他锁(IX锁)。
- 自增长锁(AUTO-INC Locking):保障AUTO_INCREMENT属性的列自增。
- 元数据锁(MDL):Metadata Lock,执行DDL语句时加的表锁,DDL语句执行时会隐式的提交当前会话中的事务。
锁结构
加锁的本质就是在内存中创建一个锁结构与行记录关联。
锁结构中包含:
- 索引信息:对于行锁,需要记录锁属于哪个索引。
- 表锁信息:属于哪个表。
- 行锁信息:记录所在的表空间、页号。
- 锁模式:S锁、X锁、IS锁、IX锁。
- 锁类型:行锁、表锁。
- 锁具体类型:Record锁、Gap锁、插入意向锁等
- 等待状态:锁是否加成功。
- 等