美文网首页
(25)行锁实现

(25)行锁实现

作者: hedgehog1112 | 来源:发表于2020-12-26 13:20 被阅读0次

行锁在 InnoDB 中基于索引实现,如加锁没用索引,退化为表锁

概要:2 相同索引,访问不同行,锁冲突   

           3 多索引,不同索引锁定不同行

           4 小表或数据转换,可能表锁,不走索引

三种行锁:Record Lock(唯一索引/主键列 精确查找,否则退化)

                  Gap Lock(非唯一索引,不包含记录本身)

                  Next-Key Lock(非唯一索引,锁左开右闭,包含记录本身)

1、不通过索引查询时,InnoDB用表锁,不是行锁

没索引,加排他锁,等待    

加索引后

2、相同索引,访问不同行,锁冲突。行锁针对索引加锁,不对记录加锁

id有索引,name没索引

3、多索引时,不同事务可用 不同索引锁定不同行

主键、唯一或普通索引都用行锁:id主键索引,name普通索引

4、是否用索引通过执行计划决定,如全表扫描效率更高(小表),就不用索引,表锁,而不是行锁

检索值的数据类型索引字段不同,虽MySQL能转换,但不用索引,导致表锁

name是varchar,不和varchar比较,转换name

二、三种行锁

1、记录锁(Record Locks)

    1)id 列必须为唯一索引主键列    2) 必须为精准匹配(=),不能为 >、<、like等

否则退化临键锁

2、间隙锁(Gap Locks)

基于非唯一索引锁间,不包含记录本身。基于Next-Key Locking 算法

    SELECT * FROM table WHERE id BETWEN 1 AND 10 FOR UPDATE;

    锁住(1,10), 2、3、4、5、6、7、8、9阻塞,1 和 10 不被锁

ps:除手动加锁,执行完某些 SQL ,InnoDB 自动加间隙锁

3、临键锁(Next-Key Locks)

特殊间隙锁包含记录本身解决幻读

1)每个非唯一索引列都有临键锁(只与非唯一索引列有关),锁左开右闭

2)UPDATE、FOR UPDATE、LOCK IN SHARE MODE操作时,InnoDB 获取记录行临键锁

3)例:age 临键锁:(-∞, 10],(10, 20],(20, 30],(30, +∞]    锁住 (10, 30)

事务 A: UPDATE table SET name = Vladimir WHERE age = 20  或    SELECT * FROM table WHERE age = 20 FOR UPDATE;        获取(20, 30] 临键锁

事务 B :INSERT INTO table VALUES(100, 20, 'Aragorn');    或  INSERT INTO table VALUES(100, 26, 'Aragorn');   被阻塞

INSERT INTO table VALUES(100, 20, 'Aragorn');

https://zhuanlan.zhihu.com/p/147543803

https://blog.csdn.net/haitun312366/article/details/8257844

相关文章

  • (25)行锁实现

    行锁在 InnoDB 中基于索引实现,如加锁没用索引,退化为表锁 概要:2 相同索引,访问不同行,锁冲突 ...

  • 一天一道面试题——数据库篇5(锁)

    锁的分类 按照属性 共享锁(读锁) 排它锁(写锁) 按照粒度 表锁 页锁 行锁(多行) InnoDB的行锁实现 记...

  • InnoDB行锁

    十、 InnoDB行锁0、 查看方式1、 共享锁2、 排他锁3、 意向锁4、行锁案列5、InnoDB锁实现 0、 ...

  • MySQL - 数据库锁机制

    1. 术语简介 行级锁(存储引擎实现)行共享锁、独占锁间隙锁Next-Key锁插入意向锁Predicate Loc...

  • MySQL中的锁3-行锁的实现

    行锁的实现 在Innodb存储引擎中,行锁有3种实现方式,分别是: Record Lock Gap Lock Ne...

  • mysql行锁和死锁检测

    行锁顾名思义,就是针对单行数据加锁,在mysql中,锁的实现是由引擎层实现的,MyISAM引擎就不支持行锁。 不支...

  • mysql行级锁

    概念 行级锁就是锁住表中指定行的记录。 行锁原理 InnoDB行锁是通过给索引项加锁来实现的,如果没有建立索引,那...

  • 数据库基础

    1 锁 1.1 InnoDB的锁 行级锁(InnoDB存储引擎实现了两种标准的)共享锁 允许事务读一行数据排他锁 ...

  • 7 - 锁(下)- 行锁:怎样减少行锁对性能的影响

    关键字 锁、行锁、性能 本节都是说在 InnoDB引擎 下的情况。 行级锁 行锁是在引擎层自己实现的,并不需要我们...

  • MySQL 锁之一——行锁

    1、概述 MySQL 锁以粒度划分可以分为三类:全局锁、表级锁和行级锁,MySQL 中的行级锁由存储引擎实现,并不...

网友评论

      本文标题:(25)行锁实现

      本文链接:https://www.haomeiwen.com/subject/srzwnktx.html