热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

Mysql之Innodb锁场景

mysql锁分类基于锁的属性分类:共享锁(读锁)、排他锁(写锁)基于锁的粒度分类:行级锁(innodb)、表锁(innodb、myisam)、页级锁(innodb引擎)、记

mysql锁分类

  基于锁的属性分类:共享锁(读锁)、排他锁(写锁)

  基于锁的粒度分类:行级锁(innodb)、表锁(innodb、myisam)、页级锁(innodb引擎)、记录锁、间隙锁、临建锁。

  mysql中的绝大部分锁都是悲观锁,按照粒度可以分为行锁和表锁:

  行锁:

    共享锁:当读取一行记录的时候,为了防止别人修改,则需要添加S锁

    排它锁:当修改一行记录的时候,为了防止别人同时进行修改,则需要添加X锁    




















 

X


S


X


不兼容


不兼容


S


不兼容


兼容


  

    记录锁:添加在行索引上的锁

    间隙锁:锁定范围是索引记录之间的间隙,针对可重复读以上隔离级别

    临键锁:记录锁+间隙锁

  表锁:

    意向锁:在获取某行的锁之前,必须要获取表的锁,分为意向共享锁,意向排它锁

    自增锁:对自增字段所采用的特殊表级锁。

  锁模式的含义:

    IX:意向排它锁

    X:锁定记录本身和记录之前的间隙(重点用)

    S:锁定记录本身和记录之前的间隙

    X,REC_NOT_GAP:只锁定记录本身(重点用)

    S,REC_NOT_GAP:只锁定记录本身

    X,GAP:间隙锁,不锁定记录本身(重点用)

    S,GAP:间隙锁,不锁定记录本身

    X,GAP,INSERT_INTENTION:插入意向锁

  监控锁:     

show engine innodb status\G //显示锁

  加锁场景:

      

 

 

 

 

  分情况来说主要是RR和RC的区别:

    查询格式:





    1. select * from table for update

    2. select * from table where id ='10' for update

    3. select * from table where name ='10' for update 





  1. RR+表无显式主键没有索引 

    初始化sql: 

      create table t(id int default null, name char(20) default null); 

      insert into t values ( 10, '10' ),(20,'20' ),(30, '30’) ;

    结论: 

      查询1和查询2(id不是索引列)加锁一致: 

      加的是:临键锁 (-∞,10],(10,20],(20,30],(30,+∞), 所以锁的是表,插入新数据超时,为了组织幻读问题。

  2.RR+表有显式主键没有索引 

    初始化sql: 

      create table t1(id int primary key not null, name char(20) default null); 

      insert into t1 values ( 10, '10' ),(20,'20' ),(30, '30’) ;

    结论: 

      查询1:加的是:临键锁 (-∞,10],(10,20],(20,30],(30,+∞), 

      查询2:加的是:id=10的行锁,保证10的主键不能再插入了

  3.RR+表无显式主键有索引 

    初始化sql: 

      create table t3(id int default  null, name char(20) default null); 

      create index idx_id on  t3 (id); 

      insert into t3 values ( 10, '10' ),(20,'20' ),(30, '30’) ;

    结论: 

      查询1(锁的row_id):加的是:临键锁 (-∞,10],(10,20],(20,30],(30,+∞), 

      查询2:加的是:1.临键锁:(-∞,10],2.索引:10 ,3.间隙锁:(10,20),减少幻读的可能,插入小于20不允许。

  4.RR+表无显式主键有唯一索引 

    初始化sql: 

      create table t4(id int default  null, name char(20) default null); 

      create unique idx_id on  tt (id); 

      insert into t4 values ( 10, '10' ),(20,'20' ),(30, '30’) ;

    结果: 

      查询1(锁的row_id):加的是:临键锁 (-∞,10],(10,20],(20,30],(30,+∞), 

      查询2:加的是: 行锁:10被锁定

   5.RR+表有显式主键有索引 

    初始化sql: 

      create table t5(id int not null, name char(20) default null,primary key(id),key idx_name(name)); 

      create unique idx_id on  tt (id); 

      insert into t4 values ( 10, '10' ),(20,'20' ),(30, '30’) ;

    结果: 

      查询1(锁的row_id):加的是:临键锁 (-∞,10],(10,20],(20,30],(30,+∞);以及10 20 30 的行锁 

      查询2:加的是: 行锁 

      查询3:加的是: 

          临键锁:(-∞,10], 

          索引:10 

          间隙锁:(10,20), 

     6.RR+表有显式主键有唯一索引 

      初始化sql:

        create table t6(id int not null,name char(20) default null,primary key(id) , nique key idx_name(name); 

        insert into t4 values ( 10, '10' ),(20,'20' ),(30, '30’) ;

      结果: 

        查询1(锁的row_id):加的是:加的是:临键锁 (-∞,10],(10,20],(20,30],(30,+∞);以及10 20 30 的行锁 

        查询2:加的是: 行锁  

  RC情况下查询1和2---都是行锁(因为临建锁和间隙锁都是解决幻读问题) 

    1.RC+表无显式主键没有索引 

    2.RC+表有显式主键没有索引 

    3.RC+表无显式主键有索引 

    4.RC+表无显式主键有唯一索引 

    5.RC+表有显式主键有索引 

    6.RC+表有显式主键有唯一索引



推荐阅读
  • golang常用库:配置文件解析库/管理工具viper使用
    golang常用库:配置文件解析库管理工具-viper使用-一、viper简介viper配置管理解析库,是由大神SteveFrancia开发,他在google领导着golang的 ... [详细]
  • 本文详细探讨了不同SQL数据库管理系统(DBMS)在限制输出结果、拼接字段和日期时间处理方面的函数差异。通过具体示例,帮助读者理解并掌握如何在不同DBMS中实现相同功能。 ... [详细]
  • PHP 5.2.5 安装与配置指南
    本文详细介绍了 PHP 5.2.5 的安装和配置步骤,帮助开发者解决常见的环境配置问题,特别是上传图片时遇到的错误。通过本教程,您可以顺利搭建并优化 PHP 运行环境。 ... [详细]
  • CentOS7源码编译安装MySQL5.6
    2019独角兽企业重金招聘Python工程师标准一、先在cmake官网下个最新的cmake源码包cmake官网:https:www.cmake.org如此时最新 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 本文深入探讨 MyBatis 中动态 SQL 的使用方法,包括 if/where、trim 自定义字符串截取规则、choose 分支选择、封装查询和修改条件的 where/set 标签、批量处理的 foreach 标签以及内置参数和 bind 的用法。 ... [详细]
  • 解决PHP与MySQL连接时出现500错误的方法
    本文详细探讨了当使用PHP连接MySQL数据库时遇到500内部服务器错误的多种解决方案,提供了详尽的操作步骤和专业建议。无论是初学者还是有经验的开发者,都能从中受益。 ... [详细]
  • 在哈佛大学商学院举行的Cyberposium大会上,专家们深入探讨了开源软件的崛起及其对企业市场的影响。会议指出,开源软件不仅为企业提供了新的增长机会,还促进了软件质量的提升和创新。 ... [详细]
  • 本文探讨了适用于Spring Boot应用程序的Web版SQL管理工具,这些工具不仅支持H2数据库,还能够处理MySQL和Oracle等主流数据库的表结构修改。 ... [详细]
  • 本文详细介绍了如何通过多种编程语言(如PHP、JSP)实现网站与MySQL数据库的连接,包括创建数据库、表的基本操作,以及数据的读取和写入方法。 ... [详细]
  • Windows 系统下 MySQL 8.0.11 的安装与配置
    本文详细介绍了在 Windows 操作系统中安装和配置 MySQL 8.0.11 的步骤,包括环境准备、安装过程以及后续配置,帮助用户顺利完成数据库的部署。 ... [详细]
  • 本文深入探讨了如何通过调整InnoDB的关键配置参数来优化MySQL的随机IO性能,涵盖了缓存、日志文件、预读机制等多个方面,帮助读者全面提升数据库系统的性能。 ... [详细]
  • 本文详细介绍如何下载并安装MySQL数据库(5.7.10版本),以及配置Navicat管理工具(免费版)。通过本指南,您将了解从下载到安装的完整流程,并掌握基本的数据库管理技能。 ... [详细]
  • MySQL中枚举类型的所有可能值获取方法
    本文介绍了一种在MySQL数据库中查询枚举(ENUM)类型字段所有可能取值的方法,帮助开发者更好地理解和利用这一数据类型。 ... [详细]
author-avatar
焦作艾文斯
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有