热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

mysql场景测试_mysql在RR级别下各场景的锁定测试

一.基本信息版本:10.0.20-MariaDB-log事务隔离级别:REPEATABLE-READinnodb_lock_wait_timeout60innodb_

一.基本信息

版本:10.0.20-MariaDB-log

事务隔离级别: REPEATABLE-READ

innodb_lock_wait_timeout=60

innodb_locks_unsafe_for_binlog=off

innodb_rollback_on_timeout=off

二. 表信息

CREATE TABLE t1

(

id int unsigned not null auto_increment,

vid int unsigned not null default 0,

name varchar(10) not null default '',

other varchar(20) not null default '',

primary key(id),

key vid(vid)

) engine =InnoDB;

Insert into t1 values(1,1,'zengxw1','I am a DBA'),(2,2,'zengxw2','I am a DBA 2');

select * from t1;

+----+-----+---------+--------------+

| id | vid | name    | other        |

+----+-----+---------+--------------+

|  1 |   1 | zengxw1 | I am a DBA   |

|  2 |   2 | zengxw2 | I am a DBA 2 |

三.场景一(排它锁与共享锁测试)

1b21da5bea5199861e557d25090a282c.png

因为排它锁与共享锁不兼容,肯定会锁。

四.场景二(无索引测试)

a62e666443c3fe650bc5d6b809e929ed.png

因为name字段上没有索引,所以锁会升级为表锁。

五.场景三(一个条件有索引,一个条件无索引测试)

16ccaa4682eed31ebf429aeb7dd7af15.png

因为vid字段上有索引,都会锁住vid=1对应的记录。

efd1c4462922f1a35ad7024a29137e6e.png

因为vid=1和vid=2锁定的记录不同。

五.场景四(vid为非唯一索引的插入测试一)

04ef78eeb668898bc4db3e5a289a3c54.png

Session 2同样插入:Insert into t1 values (4,4,'zengxw4','I am a DBA 4'),也会锁定,查找原因,是由于表中只有两条记录:vid=1和vid=2,

session 2的update操作,会在表上产生gap,

Gap范围为:[1,无穷大),此范围内的值都会锁,也就是上一个值到下一个值之间(同时需要考虑主键)。若vid的值为:1,2,3时,对应主键id分别为:1,2,5,其gap为[id任何值,1]到[2,2]再到[5,3]之间。

一句话vid要小于上一个值,vid和id都要大于或等于下一个值才不会锁。

Select * from t1;

----+-----+---------+--------------+

| id | vid | name    | other        |

+----+-----+---------+--------------+

|  1 |   1 | zengxw1 | I am a DBA   |

|  2 |   2 | ??      | I am a DBA 2 |

|  5 |   3 | ??      | I am a DBA 3 |

举例来说:

会话1执行:update t1 set name ='??' where vid=2;

会话2执行:

Insert into t1 values (4,3,'zengxw4','I am a DBA 4'); ---会锁

Insert into t1 values (6,3,'zengxw4','I am a DBA 4'); ---不会锁

Insert into t1 values (0,1,'zengxw3','I am a DBA 3'); --会锁

Insert into t1 values (10,1,'zengxw3','I am a DBA 3');--会锁

六.场景五(b为非唯一索引的插入测试二)

CREATE TABLE tt1( a INT, b INT, PRIMARY KEY (a), KEY(b));

insert into tt1 values(1,1), (3,1), (5,3), (7,6),(10,8);

select * from tt1;

+----+------+

| a  | b    |

+----+------+

|  1 |    1 |

|  3 |    1 |

|  5 |    3 |

|  7 |    6 |

| 10 |    8 |

+----+------+

会话一执行:

SELECT* FROM tt1 WHERE b =3 FOR UPDATE;

a42aa51f7586ed03049c48ca4fea499e.png

同样:

INSERT INTO tt1 SELECT 6,5; ---会锁

INSERT INTO tt1 SELECT 2,2; ---会锁

INSERT INTO tt1 SELECT 4,6; ---会锁

而INSERT INTO tt1 SELECT 8,6; --不锁

七.场景六(b为唯一索引的插入测试)

把vid改成唯一索引测试:

CREATE TABLE tt2( a INT, b INT, PRIMARY KEY (a), unique KEY(b));

insert into tt2 values(1,1), (3,3), (5,4), (7,7),(10,8);

select * from tt2;

+----+------+

| a  | b    |

+----+------+

|  1 |    1 |

|  3 |    3 |

|  5 |    4 |

|  7 |    7 |

| 10 |    8 |

会话一执行:

SELECT* FROM tt1 WHERE b =3 FOR UPDATE;

e169d94de8f4e368bdc4f49fa30ccae1.png

同样:

INSERT INTO tt2 SELECT 6,5; ---不锁

INSERT INTO tt2 SELECT 2,2; ---不锁

INSERT INTO tt2 SELECT 4,6; ---不锁

结论:当b为唯一索引时,RR级别下不存在gap锁,只有record锁。

总结:

1.  主键索引有record lock

2.  唯一辅助索引有record lock

3.  非唯一辅助索引有next-key lock

4.  没有索引的话,则是全表范围的next-key lock

5.  RC下只有record lock

6.  RR&innodb_locks_unsafe_for_binlog=1,只有record lock.



推荐阅读
  • 本文主要复习了数据库的一些知识点,包括环境变量设置、表之间的引用关系等。同时介绍了一些常用的数据库命令及其使用方法,如创建数据库、查看已存在的数据库、切换数据库、创建表等操作。通过本文的学习,可以加深对数据库的理解和应用能力。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 本文介绍了游标的使用方法,并以一个水果供应商数据库为例进行了说明。首先创建了一个名为fruits的表,包含了水果的id、供应商id、名称和价格等字段。然后使用游标查询了水果的名称和价格,并将结果输出。最后对游标进行了关闭操作。通过本文可以了解到游标在数据库操作中的应用。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
  • 在Oracle11g以前版本中的的DataGuard物理备用数据库,可以以只读的方式打开数据库,但此时MediaRecovery利用日志进行数据同步的过 ... [详细]
  • 电话号码的字母组合解题思路和代码示例
    本文介绍了力扣题目《电话号码的字母组合》的解题思路和代码示例。通过使用哈希表和递归求解的方法,可以将给定的电话号码转换为对应的字母组合。详细的解题思路和代码示例可以帮助读者更好地理解和实现该题目。 ... [详细]
  • 开发笔记:select from具体执行相关知识介绍及案例分析
    本文由编程笔记小编整理,主要介绍了select from具体执行相关的知识,包括数据插入、查询最小rowID、查询每个重复名字的最小rowID、删除重复数据等操作,并提供了案例分析。希望对读者有一定的参考价值。 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
author-avatar
mobiledu2502910203
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有