首页 > 数据库 >Mysql之Innodb锁场景

Mysql之Innodb锁场景

时间:2022-10-07 18:24:57浏览次数:64  
标签:10 场景 20 30 主键 索引 Innodb Mysql id

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的区别:

  先介绍RR下的查询锁场景

    查询格式:

    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 t1(id int default null, name char(20) default null); 

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

    结论: 

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

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

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

    初始化sql: 

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

      insert into t2 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 t5 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 t6 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+表有显式主键有唯一索引

标签:10,场景,20,30,主键,索引,Innodb,Mysql,id
From: https://www.cnblogs.com/qiulong/p/16758593.html

相关文章

  • mysql之事务隔离级别以及MVCC
    1.事务特性:ACID原子性:undolog--要么全部成功,要么全部失败 一致性:最核心和最本质的要求隔离性:MVCC(多版本并发控制)持久性:redolog......
  • MySQL用户也可以是个角色
    前言角色(Role),可以认为是一些权限的集合,一直是存在各个数据库中,比如Oracle、SQLServer、OceanBase等,MySQL自从8.0release才引入角色这个概念。为用户赋予统一的角......
  • mysql8.0创建用户并给用户授权
    MySql8有新的安全要求,不能像之前的版本那样一次性创建用户并授权需要先创建用户,再进行授权操作1.创建新用户:createuser'username'@'host'identifiedby'password'......
  • MySQL相关-内置表、版本信息
     内置数据库、表内置表查看表信息(所有数据库的表)select*frominformation_schema.TABLES 查看列信息(所有表的列表)select*frominformation_schema.COLU......
  • mysql sql语句
    基本sql语句不区分大小写,关键字尽量大写。ddl数据库操作showdabebases;查询所有数据库selectdababase();创建数据库系统creatdatabase[ifnotexists]数据库名[d......
  • MySQL库,表,数据的操作
    数据库的操作1.创建数据库createdatabase[ifnotexists]`数据库名`charset=字符编码(utf8mb4);如果多次创建会报错如果不指定字符编码,默认为utf8mb4(一个汉......
  • 安装Mysql之Playbook
    ----name:installmysqlhosts:allvars:mysql:mysql-8.0.28-linux-glibc2.12-x86_64tasks:-name:installpackageyum:name:-l......
  • MySQL面试题(三)
    27、索引的底层实现原理和优化B+树, 经过优化的B+树主 要是在所有的叶子结点中增加了指向下一个叶子节点的指针,  因此InnoDB建 议 为大部分表使用默认自增的主键作为......
  • python+request+pymysql+pytest数据驱动
    一.pymysql简单使用1.安装mysql下载地址:https://www.mysql.com/,安装教程这里不做介绍了,网上一大推。2.安装pymysql库在Terminal终端输入:pipinstallpymysql3.pymysql......
  • Flask学习笔记(十)-标准类视图及使用场景
    一、定义规则1.标准类视图,必须继承自`flask.views.View`.2.必须实现`dipatch_request`方法,以后请求过来后,都会执行这个方法。这个方法的返回值就相当于是之前的函数视图......