InnoDB引擎行锁的实现

InnoDB引擎提供行级锁,支持共享锁和排它锁,以及多粒度锁定,包括意向锁。行锁分为Record Lock、Gap Lock和Next-Key Lock。意向锁用于快速判断能否在表或页上加锁,防止幻读。Next-Key Lock在某些情况下会降级为Record Lock。
摘要由CSDN通过智能技术生成

InnoDB锁

在一般的数据库中为了保证数据库事务的四个特性,不可避免的要使用到锁.而InnoDB为我们提供了一个很好的行级锁,即锁定的是数据行,而不是整张表.,当然了,在某些情况下也会直接锁表,而不是行锁,比如说全表更新.下面来探讨一下InnoDB的行级锁.

锁的类型

InnoDB存储引擎为我们提供了两种标准的行级锁.

  • 共享锁(S Lock),允许事务读取一行数据
  • 排它锁(X Lock),允许事务删除或更新一条数据.

正如名称所描述的,共享锁就是能够共享的,就是说在一个事务获取了共享锁之后,另一个事务依旧可以获取共享锁.排它锁是不共享的,当有一个事务获取排它锁之后,则不允许其他任何事务获取任何锁. 在InnoDB中如果想要读取或者写入一条数据,首先应该获得它的锁.

并且,InnoDB存储引擎支持多粒度锁定,这种锁定允许事务在行级上的锁和表级上的锁同时存在. 为了实现这个操作,InnoDB提供了一种额外的锁的方式,称为意向锁.

在InnoDB中,可以将上锁的对象看成一颗树,如果想要对最下层的对象加锁,也就是行锁,就必须要先对上层的对象上锁.也就是说,如果想要在一行上加写锁,首先要在表上加意向排它锁,其次在行所在的页上也加入意向排它锁,最后在那一行上加入排它锁.

这一要注意以下,意向锁本身互相都是相互兼容的.意思就是如果表上加了意向共享锁,那么也可以继续在表上加入意向排它锁.

那这个意向锁又是用来干什么的呢. 意向锁主要是为了很容易的知道我即将要加锁的页或者表能不能被我加锁. 比如说,事务T1为表A中的一行记录加了排他锁,这个时候事务T2要做全表扫描,也就是说要在表级别加共享锁,这个时候,T2首先要判断这个表上是否能加共享锁.如果没有意向锁,那么T2就必须扫描全表,看是否能够加意向共享锁,也就是看看表中有没有任意一行加了排它锁,如果加了,就阻塞,等待,如果任意一行都没有排它锁,则可以加共享锁. 但是有了意向锁之后,因为如果要锁定某一行,就必须先在行锁的页和表上加意向锁.这个时候T2事务只需要看看表上是否有

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值