数据库锁

七、补充知识

7.1 数据库的锁

7.1.1 数据库的锁加在哪里

数据库的锁是加在数据行对应的索引上的,这个概念在后续理解锁的范围时至关重要。机智如你可能会问,没有索引怎么办?答案是,不管你建或不建,总有索引在那里!下面简单过一下:

InnoDB中有两类索引:

  • Clustered Index: 聚集索引(聚簇索引),通过聚集索引可以直接定位到数据的物理存储位置,从而进行IO读写,它是接触到数据的必经之路。每张表都会默默地建立聚集索引
  • Secondary Index: 辅助索引(非聚集索引),除了Clustered Index,其他都是Secondary Index(所以我们自己建的都叫辅助索引)。通过辅助索引,可以查到数据的主键或者数据行id,然后再通过主键或者数据行id查聚集索引获取数据的物理存储位置,才能进行IO读写。

讲了这么多想说什么呢?综上所述!在真正接触到数据之前,任何数据库操作都会先走索引,这也就不难理解为什么锁是加在索引上的了

7.1.2 什么时候会加锁

在数据库增删改查四种操作中,insert、delete和update都是会加排它锁(即下文中的Exclusive Lock)的,而select只有显式声明才会加锁。

7.1.3 锁的分类

InnoDB有很多锁,单是在官网上列出来的就有8种,如果组合使用就更多了。这里只简单讲一下后续会用到的锁。

  • Shared and Exclusive Locks:这两个锁类似于Java中的读写锁,其中Shared Lock相当于Java中的读锁,读写、写写是互斥的,读读是可以并发的;Exclusive Lock相当于Java中的写锁,读写、写写、读读都是互斥的
  • Record Locks:行锁,顾名思义,是加在索引行(对!是索引行!不是数据行!)上的锁。比如select * from user where id=1 and id=10 for update,就会在id=1和id=10的索引行上加Record Lock
  • Gap Locks:间隙锁,它会锁住两个索引之间的区域。比如select * from user where id>1 and id<10 for update,就会在id为(1,10)的索引区间上加Gap Lock
  • Next-Key Locks:也叫间隙锁,它是Record Lock + Gap Lock形成的一个闭区间锁。比如select * from user where id>=1 and id<=10 for update,就会在id为[1,10]的索引闭区间上加Next-Key Lock
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值