InnoDB实现了两种类型的行锁。

共享锁(S):允许一个事务去读一行,阻止其他事务获得相同的数据集的排他锁。

排他锁(X):允许获得排他锁的事务更新数据,但是组织其他事务获得相同数据集的共享锁和排他锁。

简单来说

共享锁就是我读的时候,你可以读,但是不能写。

排他锁就是我写的时候,你即不能读也不能写。

除此之外InnoDB还有两个表锁:

意向共享锁(IS):表示事务准备给数据行加入共享锁,也就是说一个数据行加共享锁前必须先取得该表的IS锁

意向排他锁(IX):类似上面,表示事务准备给数据行加入排他锁,说明事务在一个数据行加排他锁前必须先取得该表的IX锁。

注意:意向锁是InnoDB自动加的,不需要用户干预。

对于insert、update、delete,操作

InnoDB会自动给涉及的数据加排他锁;而对于一般的Select语句,InnoDB不会加任何锁(如果没有锁 也就是 select …… from where…… (没有额外加锁后缀)使用MVCC(multiple-version-concurrency-control)是行级锁的变种,它在普通读情况下避免了加锁操作,因此开销更低)但是我们可以通过以下语句给select加共享锁或排他锁。

共享锁:select * from table_name where ..... lock in share mode

排他锁:select * from table_name where .....for update

下面我将举例说明【注意:需要关闭自动提交事务 set autocommit = 0】

加入共享锁(我读的时候,你可以读,但是不能写

事务1

事务2

开启事务

start transaction;

开启事务

start transaction;

查询id=1并且加入共享锁

select  * from test where id = 1 lock in share mode;

查询id=1并且加入共享锁

select  * from test where id = 1 lock in share mode;

更新此条纪录,发现锁被占用等待

其他事务退出以后 更新成功

也去更新 导致死锁退出

 

加入排他锁 这里就不演示了。

具体锁的实现原理

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

InnoDB这种行锁实现特点意味着:只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁!

行锁分为三种情形:

Record lock :对索引项加锁,即锁定一条记录。

Gap lock:对索引项之间的‘间隙’、对第一条记录前的间隙或最后一条记录后的间隙加锁,即锁定一个范围的记录,不包含记录本身 InnoDB使用间隙锁的目的,主要为了防止幻读)

Next-key Lock:锁定一个范围的记录并包含记录本身(上面两者的结合)。

注意:InnoDB默认级别是repeatable-read级别,所以下面说的都是在RR级别中的。

Next-Key Lock是行锁与间隙锁的组合,这样,当InnoDB扫描索引记录的时候,

当我们用范围条件查询数据,会首先对选中的索引记录加上行锁(Record Lock),再对索引记录两边的间隙加上间隙锁(Gap Lock)。如果一个间隙被事务T1加了锁,其它事务是不能在这个间隙插入记录的。

下面举例说明

假如数据库有以下3条记录

比如 我要查询

Select * frm test where id>2 for update,

这个时候InnoDB不仅会对符合条件的id值为3的记录加锁,也会对id大于3(这些记录并不存在)的“间隙”加锁。

注意:::

当我们在使用范围条件检索并锁定记录时,InnoDB这种加锁机制会阻塞符合条件范围内键值的并发插入,这往往会造成严重的锁等待

因此,尤其是并发插入比较多的应用,

我们要尽量优化业务逻辑,尽量使用相等条件来访问数据,避免使用范围条件。

转载于:https://www.cnblogs.com/javabigdata/p/7612692.html

mysql锁机制(Innodb引擎)相关推荐

  1. 大厂面试官必问的Mysql锁机制

    前言 前几天有粉丝和我聊到他找工作面试大厂时被问的问题,因为现在疫情期间,找工作也特别难找.他说面试的题目也比较难,都偏向于一两年的工作经验的面试题. 他说在一面的时候被问到Mysql的面试题,索引那 ...

  2. mysql三锁,mysql锁机制之表锁(三)

    顾名思义,表锁就是一锁锁一整张表,在表被锁定期间,其他事务不能对该表进行操作,必须等当前表的锁被释放后才能进行操作.表锁响应的是非索引字段,即全表扫描,全表扫描时锁定整张表,sql语句可以通过执行计划 ...

  3. 聊聊大厂面试官必问的 MySQL 锁机制

    前言 前几天有粉丝和我聊到他找工作面试大厂时被问的问题,因为现在疫情期间,找工作也特别难找.他说面试的题目也比较难,都偏向于一两年的工作经验的面试题. 他说在一面的时候被问到Mysql的面试题,索引那 ...

  4. 11. mysql锁机制_深入探讨MySQL锁机制

    MySQL锁机制究竟是怎样的呢?这是很多人都提到过的问题,下面就为您详细介绍MySQL锁机制方面的知识,希望可以让您MySQL锁机制有更多的了解. 当前MySQL已经支持 ISAM, MyISAM, ...

  5. 面试让HR都能听懂的MySQL锁机制,欢声笑语中搞懂MySQL锁

    腾讯云数据库负责人林晓斌说过:"我们面试MySQL同事时只考察两点,索引和锁".言简意赅,MySQL锁的重要性不言而喻. 本文通过同事"侨总"的一场面试,带你通 ...

  6. 第 4 章 MySQL 锁机制

    第 4 章 MySQL 锁机制 1.概述 1.1.锁的定义 锁的定义 锁是计算机协调多个进程或线程并发访问某一资源的机制. 在数据库中,除传统的计算资源(如CPU.RAM.I/O等)的争用以外,数据也 ...

  7. MySql锁机制(全网最全、最详细、最清晰)

    1.MySql锁机制 锁机制的作用: 解决因为资源共享,而造成的并发问题. 没有锁机制时: 例如一号用户和二号用户都要去买同一件商品(假如这件商品是一件衣服),一号用户手速稍微快了一些,于是就先买到了 ...

  8. [转]MySQL锁机制,行锁竟然加在索引上!!!

    原文作者qq_40174198 原文连接:MySQL锁机制,行锁竟然加在索引上!- https://blog.csdn.net/qq_40174198/article/details/11183548 ...

  9. Mysql锁机制及原理简析

    Mysql锁机制及原理简析 一.前言 1.什么是锁? 锁是计算机协调多个进程或线程并发访问某一资源的机制. 锁保证数据并发访问的一致性.有效性: 锁冲突也是影响数据库并发访问性能的一个重要因素. 锁是 ...

  10. MySQL锁机制全面解析

    这里写目录标题 一.前言 二.锁的类型 2.1 全局锁 2.2 表级锁 2.2.1 表锁 2.2.2 元数据锁(Meta Data Locks) 2.2.3 自增列锁(AUTO-INC Locks) ...

最新文章

  1. 配置开发ExtJS环境
  2. java怎么创建二进制文件_Java:如何编写二进制文件?
  3. 2.8 FSM之Moore和Mealy part1
  4. zabbix入门到精通之--zabbix proxy配置(二)
  5. Hibernate HQL的update方法详解
  6. vsftpd使用方法小结、Linux安装JDK出现“NoClassDefFoundError: /Object”的解决方案、ubuntu 12.04安装jdk
  7. junit:junit_简而言之,JUnit:另一个JUnit教程
  8. C++ 常用查找算法
  9. 电脑主板接口_PCI接口借尸还魂?精英发布新款B450电脑主板,配备老式PCI接口...
  10. Android音视频【六】视频数据存储方式YUV
  11. 计算机专业英语第五章ppt,计算机专业英语课件5.ppt
  12. OO(面向对象)的设计原则
  13. python 移动平均线_如何使用NumPy计算移动平均线?
  14. android 蓝牙与单片机通信原理图,单片机结合蓝牙模块串口通信
  15. 2020全国高校计算机能力挑战赛(word模拟题)
  16. CEF3 C++接口实现自定义浏览器[simple version]
  17. php session fixation,什么是session fixation攻击
  18. xmind思维导图pdf格式如何导出?xmind思维导图pdf格式导出流程介绍
  19. ensp路由器注册_使用ensp进行简单的路由器互连实验
  20. 百度浏览器的编程html,百度来路浏览器劫持代码(替换浏览器正在浏览页面)...

热门文章

  1. 和upm_官方辟谣!UPM减免15%学费是假的?
  2. python层级抓取_python实现提取str字符串/json中多级目录下的某个值
  3. python oop 继承_oop-在Python中继承方法的文档字符串
  4. 理解Session实现原理及安全运用
  5. 西瓜书学习记录-神经网络(第五章)
  6. Fragment之一:Fragment入门
  7. xgboost相比传统gbdt有何不同?xgboost为什么快?xgboost如何支持并行?
  8. spark学习:ContextCleaner清理器
  9. scala学习笔记-Map与Tuple(10)
  10. java类加载-ClassLoader双亲委派机制