mysql锁机制,视频讲解(附个人笔记)

目录

1、msql5.7 InnoDB锁的分类

2、行锁

3、表锁

4、区间定义

5、记录锁(Record Lock)

6、间隙锁(Gap Lock)

7、临键锁(Next-Key Lock)


1、msql5.7 InnoDB锁的分类

按照以下属性分类:

  • 粒度:行锁、表锁
  • 用法:乐观锁、悲观锁
  • 类型/基本模式:共享锁、排他锁、意向锁、自增锁
  • 算法:间隙锁、记录锁、临键锁、插入意向锁

2、行锁

 

1、共享锁(读锁):多个事务对于同一数据可共享一把锁,都能访问,不能修改。

加锁方式:

select * from student where id=1 LOCK IN SHARE MODE

释放方式:commit/rollback

2、排他锁(写锁):不能与其他锁共存,如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该数据行的锁(共享锁、排他锁),只有获取该数据行排他锁的事务才能对该数据行进行读取和修改。

加锁方式:

  • 自动:delete/update/insert
  • 手动:
select * from student where id = 1 FOR UPDATE

3、表锁

1、意向共享锁:事务准备加共享锁,必须先得到表的意向共享锁。

2、意向排他锁:事务准备加排他锁,必须先得到表的意向排他锁。

  • 与行表的区别:

  • 一个事务成功给一张表加上表锁的前提:没有其他任何事务已经锁定的该表中任何一行数据。
  • 意向锁属于一类表锁,在本质上是提高加表锁效率的标志(类似于火车上厕所上的指示灯)。由数据引擎自己维护,用户无法手动操作。

eg:一个事务对student表中的一行数据加上共享锁,student表就会出现意向共享锁,标志着这个表中有共享锁,其他的事务再想给这个表加表锁的时候就不用进行全表扫描,提高的加表锁的效率。


  • 问题:一个表中没有任何索引的时候,加行锁会造成锁表。

因为,行锁锁住的实际上是索引项。优先级从高到低依次是:

1、primany key(主键)

2、unique key --no null(唯一非空索引)

3、_rowid(隐藏的唯一标识符)

没有任何索引会进行全表扫描,将_rowid作为聚集索引(索引的逻辑顺序和数据的物理顺序一致),造成锁表。


4、区间定义

以ID的主键索引来划分数据的区间(图中箭头指向的为主键索引)

5、记录锁(Record Lock)

锁定记录

使用条件见下图:

6、间隙锁(Gap Lock)

锁定范围

使用条件见下图:

7、临键锁(Next-Key Lock)

锁定范围加记录(Next-Key Lock = Gap Lock + Gap Lock)

使用条件见下图:

            

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值