美文网首页
MySQL数据库InnoDB引擎锁定范围以及sql语句使用的锁类

MySQL数据库InnoDB引擎锁定范围以及sql语句使用的锁类

作者: code_god_ming | 来源:发表于2019-11-21 11:16 被阅读0次

1.InnoDB引擎使用了七种类型的锁,他们分别是:

共享锁(S锁)/排它锁(X锁)

意向锁(Intention Locks):表级别的锁

记录锁(Record Locks):记录锁是一种加在索引数据记录上锁,以防止其他事务对于该数据记录进行修改、删除。

间隙锁(Gap Locks):间隙锁是加载某个索引记录区间上的锁,间隙锁防止其他事务在锁定区间上插入新的记录,避免不可重复读。

 临键锁(Next-Key Locks):临键锁是记录锁和间隔锁的结合,它既可以锁定索引记录也可以锁定索引记录之间的区间。临键锁主要的目的是解决幻读的问题。

插入意图锁(Insert Intention Locks):插入意向锁是一种间隙锁,当事务视图想向一个区间插入数据时,首先获得插入意向锁。

插入间隙锁规定,如果多个事务向同一区间插入数据时,如果这些数据属于不同的位置(索引位置),那么之间的插入是互不影响的。

自增锁(AUTO-INC Locks):自增锁是一种特殊表锁

2. 加锁语句

select ... from语句:InnoDB引擎采用多版本并发控制(MVCC)的方式实现了非阻塞读,所以对于普通的select读语句,InnoDB并不会加锁【注1】。

select ... from lock in share mode语句:这条语句和普通select语句的区别就是后面加了lock in share mode,通过字面意思我们可以猜到这是一条加锁的读语句,并且锁类型为共享锁(读锁)。InnoDB会对搜索的所有索引记录加next-key锁,但是如果扫描的唯一索引的唯一行,next-key降级为索引记录锁。

select ... from for update语句:和上面的语句一样,这条语句加的是排他锁(写锁)。InnoDB会对搜索的所有索引记录加next-key锁,但是如果扫描唯一索引的唯一行,next-key降级为索引记录锁。

update ... where ...语句:。InnoDB会对搜索的所有索引记录加next-key锁,但是如果扫描唯一索引的唯一行,next-key降级为索引记录锁。【注2】

delete ... where ...语句:。InnoDB会对搜索的所有索引记录加next-key锁,但是如果扫描唯一索引的唯一行,next-key降级为索引记录锁。

insert语句:InnoDB只会在将要插入的那一行上设置一个排他的索引记录锁。

如果一个查询使用了辅助索引并且在索引记录加上了排他锁,InnoDB会在相对应的聚合索引记录上加锁。

如果你的SQL语句无法使用索引,这样MySQL必须扫描整个表以处理该语句,导致的结果就是表的每一行都会被锁定,并且阻止其他用户对该表的所有插入。

注1:在事务隔离级别为SERIALIZABLE时,普通的select语句也会对语句执行过程中扫描过的索引加上next-key锁。如果语句扫描的是唯一索引,那就将next-key锁降级为索引记录锁了。 

注2:当更新语句修改聚合索引(主键)记录时,会对受影响的辅助索引执行隐性的加锁操作。当插入新的辅助索引记录之前执行重复检查扫描时和当插入新的辅助索引记录时,更新操作还对受影响的辅助索引记录添加共享锁。

参考自:https://segmentfault.com/a/1190000013307132  文章写的很好

相关文章

  • MySQL数据库InnoDB引擎锁定范围以及sql语句使用的锁类

    1.InnoDB引擎使用了七种类型的锁,他们分别是: 共享锁(S锁)/排它锁(X锁) 意向锁(Intention ...

  • MYSQL 5.7 InnoDB引擎 锁机制

    全文主要内容 MYSQL InnoDB引擎的锁类型以及特点 不同SQL语句的加锁情况 锁之间的兼容性关系 死锁发现...

  • 在kotlin中使用mysql行级锁

    mysql中的锁 首先需要介绍一下mysql的锁。一般我们使用InnoDB数据库引擎+行级锁,SQL为:SELEC...

  • Mysql innodb SQL语句加锁方式

    mysql innodb存储引擎支持事务,是mysql的默认存储引擎。 数据库事务 事务是由一组sql语句组成的逻...

  • 3.行级锁

    行级锁介绍 InnoDB存储引擎实现 一. InnoDB的行级锁,按照锁定范围来说,分为三种: 1.记录锁(Rec...

  • 淘宝MySQL文档整理

    MySQL · 引擎特性 · InnoDB 事务锁系统简介 MySQL · 引擎特性 · Innodb 锁子系统浅...

  • 12.1KOA mysql 数据库

    mysql 数据库 安装 mysql 模块 使用数据库连接执行 SQL 语句 使用数据库连接池执行 SQL 语句

  • mysql规范

    一、基础规范【强制】使用InnoDB存储引擎解读:InnoDB存储引擎是MySQL默认存储引擎,支持事务和行级锁,...

  • 浅谈InnoDB存储引擎中的锁

    InnoDB存储引擎是MySQL数据库默认的事务型存储引擎,也是使用比较多的存储引擎。InnoDB存储引擎不紧支持...

  • 【原创】因酷数据库开发规范

    基本规范 所有表必须使用Innodb存储引擎Innodb存储引擎是Mysql5.6以后默认引擎支持事务,行级锁,更...

网友评论

      本文标题:MySQL数据库InnoDB引擎锁定范围以及sql语句使用的锁类

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