数据库MySQL For Update 加锁分析

MySQL InnoDB 锁 - For Update 加锁分析:

1. InnoDB锁 简单介绍

2. 当前读加锁分析:REPEATABLE-READ 可重复读、READ-COMMITTED 读已提交

3. 锁模式说明及8.0的data_locks表

一、InnoDB锁

1、全局锁

全局读锁,flush tables with read lock,整库处于只读状态。全局锁的一个典型场景:全库逻辑备份,--single-transaction实现一致性读。

2、表级锁

表锁,lock tables…read/write,主动在表上加读锁或写锁;

元数据锁(meta data lock,MDL),访问表时自动加上,防止DDL和DML并发的冲突,保证读写正确性;

自增锁,表中auto_increment字段的自增值生成控制,内存自增计数器,8.0之后通过redo进行持久化;

意向锁,只会和表级锁发生冲突,不会阻止除表锁请求之外的锁,表明有事务即将、或正锁定某N行;

  1. 意向共享锁(IS):SELECT ... LOCK IN SHARE MODE,在对应记录行上加锁之前,在表上加意向共享锁;

  2. 意向排它锁(IX):SELECT .. FOR UPDATE,悲观锁,对表所有扫描过的行都会被加上意向排它锁,若扫描行其中有行锁,则会被阻塞;对SELECT索引加排它锁,阻塞其他事务修改或SELECT ... FOR SHARE(在8.0新增的方式);

3、行锁

行锁,事务锁,只有发生行锁冲突,才会出现事务锁的排队等待。

两阶段锁协议:行锁在需要时加上,事务结束时释放。

行锁的3种算法:record lock、gap lock、next-key lock

  1. 记录锁 record lock:添加在索引上,表中没有索引时会默认添加在默认创建的聚集索引上;

  2. 间隙锁 gap lock:锁定一个范围,可重复读 隔离级别下,行锁会变成gap锁(范围锁),降低并发性,当前读(dml、select for update),若where条件列上有索引,加gap lock在索引上,实现可重复读;

  3. Next-Key Lock:Gap Lock+Record Lock,锁定一个范围,并且锁定记录本身;

    ① 唯一索引或主键,Next-Key Lock 降为 Record Lock,即仅锁住索引本身,而不是范围。

    ② 辅助索引(二级索引),默认使用Next-Key Locking加锁,锁定范围是前一个索引到后一个索引之间范围,左开右闭。

二、当前读加锁分析

分析不同隔离级别,当前读(dml、select … for update)的加锁情况

1、REPEATABLE-READ 可重复读

1.1、表无显式主键和索引

如上,可重复读,表上没有主键(会自动生成隐式主键聚集组织表),也没有索引,全表SELECT的当前读的加锁情况:

  ① 对表添加 IX 锁

  ② 在"supremum"上添加 Next-Key Lock(supremum表示高于表中任何一个索引的值),即最大索引值之后的间隙锁住

  ③ 在三条记录上分别添加 Next-Key Lock

root@test 16:08 > begin;# where上带条件 id = 3root@test 16:08 > select * from t_student where id = 3 for update;+----+-------+| id | name  |+----+-------+|  3 | linda |+----+-------+root@test 16:09 > show engine innodb status\G# 锁信息如上,表上IX,supremum 和 三条记录上添加 Next-Key Lock# 另开一个sessionroot@test 16:09 > begin;root@test 16:13 > insert into t_student values(2,&#
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值