Innodb搜索引擎的锁机制

一、学习过程中对概念的归类、总结

      看了好几天博客,学的挺艰难,由于锁的种类比较多,大多数博客仅仅是罗列出来,分不清这些概念的上下级或者说包含关系,也可以理解为每个概念的作用域,所以看起来很痛苦,也记不住,有种死记硬背的感觉。然后今天突发灵感,有了一点突破,记录一下,如有不对,日后再修改。

      下面定义的共享锁、排它锁,应该说只是一个广泛的行锁的概念。就像我们说汽车、房子、饮料,而没有说具体的什么汽车、什么房子、什么饮料。而像下面会提到的Record Lock、Gap Lock、Next-key lock这三种锁,应该就是具体的行锁,比如客车、别墅、冰红茶。这三种具体行锁分别属于共享锁、排他锁两个大类别类别。具体属于哪个类别那要看加锁场景。如果是select语句加锁,那就属于共享锁类别、如果是insert、delete、update加锁,那就属于排它锁类别。

       声明:非本专业人员,如有不对,希望有缘人不吝赐教。

二、InnoDB引擎行锁的介绍

InnoDB 有以下两种类型的锁

  1. 共享锁(S):允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁。
  2. 排他锁(X):允许获得排他锁的事务更新数据,阻止其他事务取得相同数据集的共享读锁和排他写锁。

除此之外还有两种意向锁

  1. 意向共享锁(IS):事务打算给数据行加行共享锁,事务在给一个数据行加共享锁前必须先取得该表的IS锁。
  2. 意向排他锁(IX):事务打算给数据行加行排他锁,事务在给一个数据行加排他锁前必须先取得该表的IX锁。

意向锁是InnoDB自动加的,不需要用户干预。UPDATE/DELETE/INSERT 语句 InnoDB 会自动给涉及的数据集加排他锁。普通的 SELECT 语句 InnoDB 不加锁。不过可以在语句中显式的给数据集加共享锁或者排他锁。

在 RC(read commited)级别中,数据的读取都是不加锁的,但是数据的写入、修改和删除是需要加锁的。

InnoDB 行锁是通过给索引项加锁实现的,如果没有索引,InnoDB 将通过隐藏的聚簇索引来对记录加锁。 InnoDB 行锁有三种情形:

  1. Record Lock:对索引项加锁
  2. Gap Lock:对索引之间的“间隙”、第一条记录前的“间隙”或最后一条记录的“间隙”加锁。
  3. Next-key lock:前两种的组合,对记录及其前面的间隙加锁。

如果不通过索引条件检索数据,那么 InnoDB 将对表中的所有记录加锁,实际效果就和表锁一样了。

引用文章:
https://www.jianshu.com/p/2e908f0de8d0

​​​​​​​

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值