mysql间隙锁,next-key lock,row锁加锁范围分析

介绍

mysql可重复读隔离级别的实现主要依赖mvcc(多版本并发控制)和间隙锁,行锁,多种锁的组合使用来解决可重复读和幻读的问题。
mvcc:主要是给保存每行数据的多个版本,每个版本多了2个字段,一个为最后更新事务的id,一个是删除事务的id。在可重复读隔离级别下,每个事务都只能查询出小于等于自己事务id的版本记录。但这只针对于普通的,不加锁的select语句。对于update,delete语句如果想避免幻读,则需要间歇锁。
mysql innodb的锁主要依赖索引实现,如下我们来分析下,不同的sql语句,不同的索引类型加锁的范围的异同。

1.准备测试数据

CREATE TABLE `lock_test`  (`id` int(11) NOT NULL,`a` int(11) NOT NULL,`b` int(11) NULL DEFAULT NULL,PRIMARY KEY (`id`) USING BTREE,UNIQUE INDEX `a`(`a`) USING BTREE,INDEX `b`(`b`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;-- ----------------------------
-- Records of lock_test
-- ----------------------------
INSERT INTO `lock_test` VALUES (0, 0, 0);
INSERT INTO `lock_test` VALUES (10, 10, 10);
INSERT INTO `lock_test` VALUES (15, 15, 15);
INSERT INTO `lock_test` VALUES (20, 20, 20);
INSERT INTO `lock_test` VALUES (25, 25, 25);

2.唯一索引等值查询

innodb默认会加next key lock,即间歇锁gap+row锁,组成的前开后闭区间。
给非主键索引加锁时除非查询语句只用到了覆盖索引否则也会锁住对应的主键索引记录。

  • 2.1 值存在

      select * from lock_test where a = 10 for update;

    如上由于是唯一索引,锁区间由(10,15],退化成行级锁 lock row 15

  • 2.2 值不存在

      select * from lock_test where a = 9 for update;

    值不存在如上由于是唯一索引,锁区间由(10,15],退化成间隙锁(5,10)

  • 3.唯一索引范围查询

      select * from lock_test where a>=5 and a<=10 FOR UPDATE ;

    范围闭区间查询都是加向前找到第一个不等于比较值的索引行,加上next-key lock锁,
    如上例,锁区间为(0,15]

  • 4.非唯一索引等值查询

      select * from lock_test where b=10 FOR UPDATE ;

    非唯一索引由于值不是唯一的。会在前后区间加上间隙锁和行锁
    [5,15]

  • 5.非唯一索引范围查询

      select * from lock_test where b>=5 and b<=10 FOR UPDATE ;

    非唯一索引由于值不是唯一的。会在前后区间加上间隙锁和行锁
    b>=5 锁区间=> [0,+∞)
    b<=10 锁区间 => (-∞,15]
    最终区间为[0,15]

  • 6.mysql 当前锁的占用情况查询

      – 查询线程执行情况SELECT * FROM performance_schema.threads WHERE processlist_id=– 查看当前所有事务select * from information_schema.innodb_trx;– 查看正在锁的事务select * from information_schema.innodb_locks;– 查看等待锁的事务select * from information_schema.innodb_lock_waits;– 查看表锁show open tables where In_use>0;–查看死锁show engine innodb status;

    以上测试基于mysql 5.7.33, mysql 8.0对加锁范围有所优化

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/229600.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

maui sqlite开发一个商城加购物车的演示(3)

购物车界面及代码 <?xml version"1.0" encoding"utf-8" ?> <ContentPage xmlns"http://schemas.microsoft.com/dotnet/2021/maui"xmlns:x"http://schemas.microsoft.com/winfx/2009/xaml"xmlns:syncfusion"clr-namesp…

数据修复:.BlackBit勒索病毒来袭,安全应对方法解析

导言&#xff1a; 黑色数字罪犯的新玩具——.BlackBit勒索病毒&#xff0c;近来成为网络安全领域的头号威胁。这种恶意软件以其高度隐秘性和毁灭性而引起广泛关注。下面是关于.BlackBit勒索病毒的详细介绍&#xff0c;如不幸感染这个勒索病毒&#xff0c;您可添加我们的技术服…

ArcMap自定义脚本工具箱迁移至ArcGIS pro

本文记录了将ArcMap10.7创建的自定义脚本工具箱&#xff08;.tbx&#xff09;迁移至ArcGIS pro的过程 ArcGIS Pro使用的是python版本与ArcMap不同&#xff0c;前者为python3&#xff0c;后者为python2。由于python3 和 python2 的部分语法不兼容&#xff0c;以及一些地理处理工…

87 GB 模型种子,GPT-4 缩小版,超越ChatGPT3.5,多平台在线体验

瞬间爆火的Mixtral 8x7B 大家好&#xff0c;我是老章 最近风头最盛的大模型当属Mistral AI 发布的Mixtral 8x7B了&#xff0c;火爆程度压过Google的Gemini。 缘起是MistralAI二话不说&#xff0c;直接在其推特账号上甩出了一个87GB的种子 随后Mixtral公布了模型的一些细节&am…

剑指offer 背包问题求具体方案

剑指offer 背包问题求具体方案 题目 有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。 第 i 件物品的体积是 vi&#xff0c;价值是 wi。 求解将哪些物品装入背包&#xff0c;可使这些物品的总体积不超过背包容量&#xff0c;且总价值最大。 输出 字典序最小的方…

vue3的大致使用

<template><div class"login_wrap"><div class"form_wrap"> <!-- 账号输入--> <el-form ref"formRef" :model"user" class"demo-dynamic" > <!--prop要跟属性名称对应-->…

华为技面三轮面试题

1. 最长回文子串 -- 中心扩散法 给你一个字符串 s&#xff0c;找到 s 中最长的回文子串。 如果字符串的反序与原始字符串相同&#xff0c;则该字符串称为回文字符串。 示例 1&#xff1a; 输入&#xff1a;s "babad" 输出&#xff1a;"bab" 解释&…

磁力计LIS2MDL开发(3)----九轴姿态解算

磁力计LIS2MDL开发.3--九轴姿态解算 概述视频教学样品申请完整代码下载使用硬件欧拉角万向节死锁四元数法姿态解算双环PI控制器偏航角陀螺仪解析代码 概述 LIS2MDL 包含三轴磁力计。 lsm6ds3trc包含三轴陀螺仪与三轴加速度计。 姿态有多种数学表示方式&#xff0c;常见的是四元…

服务器RAID配置及功能介绍

服务器RAID配置及功能介绍 一、RAID磁盘阵列详解1.RAID磁盘阵列介绍2.RAID 03.RAID14.RAID35.RAID56.RAID67.RAID 10总结阵列卡介绍 一、RAID磁盘阵列详解 1.RAID磁盘阵列介绍 ①是Redundant Array of lndependent Disks的缩写中文简称为独立冗余磁盘阵列。 ②把多块独立的物…

聊聊AsyncHttpClient的ListenableFuture

序 本文主要研究一下AsyncHttpClient的ListenableFuture ListenableFuture org/asynchttpclient/ListenableFuture.java public interface ListenableFuture<V> extends Future<V> {/*** Terminate and if there is no exception, mark this Future as done an…

NBA得分数据可视化

简介 这是上学期的一些课外活动内容&#xff0c;将 NBA 得分数据进行可视化&#xff0c;并进行后续的探索性分析和建模&#xff08;本文未介绍&#xff09;。主要研究动机来源于这篇论文&#xff1a; 该论文使用二元的伽马过程来刻画 NBA 主客场得分数据&#xff0c;并且考虑了…

@RabbitHandler和@RabbitListener的区别

RabbitHandler 和 RabbitListener 是Spring AMQP&#xff08;特别是针对RabbitMQ&#xff09;中常用的两个注解&#xff0c;它们在消息处理中扮演着不同的角色。 RabbitListener 定义&#xff1a;RabbitListener 注解用于标记一个方法&#xff0c;使其成为消息队列的监听器&am…

5.5 Linux Apache服务

1、概念介绍 a. Web 服务简介 WEB服务器也称为WWW(WORLD WIDE WEB&#xff0c;万维网)服务器&#xff0c;主要功能是提供网上信息浏览服务。 常用web服务器&#xff1a;httpd&#xff08;apache&#xff09;、nginx、tomcat、IIS 客户端&#xff1a;IE、firefox、chrome b…

高通平台开发系列讲解(AI篇)SNPE工作流程介绍

文章目录 一、转换网络模型二、量化2.1、选择量化或非量化模型2.2、使用离线TensorFlow或Caffe模型2.3、使用非量化DLC初始化SNPE2.4、使用量化DLC初始化SNPE三、准备输入数据四、运行加载网络沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇章主要介绍SNPE模型工作…

Android终端模拟器Termux上使用Ubuntu

Termux 上安装各种 Linux 系统是通过 proot-distro 工具来实现的&#xff0c;所以先安装一下 proot-distro 工具。 ~ $ pkg install proot-distro 查看Termux支持安装那些Linux ~ $ proot-distro listSupported distributions:* Alpine LinuxAlias: alpineInstalled: noComme…

学习Java第70天,过滤器Filter简介

过滤器概述 Filter,即过滤器,是JAVAEE技术规范之一,作用目标资源的请求进行过滤的一套技术规范,是Java Web项目中最为实用的技术之一 Filter接口定义了过滤器的开发规范,所有的过滤器都要实现该接口 Filter的工作位置是项目中所有目标资源之前,容器在创建HttpServletRequest和…

Cmake基础(6)

这篇文章阐述如何添加第三方库 文章目录 包含目录和依赖库注意事项target_link_libraries 基本用法&#xff1a;修饰词&#xff1a;PUBLIC、PRIVATE、INTERFACE 其他注意事项&#xff1a;optimized 和 debug 配置标识&#xff1a;示例&#xff1a; 包含目录和依赖库 把上一篇…

【C++】POCO学习总结(十八):XML

【C】郭老二博文之&#xff1a;C目录 1、XML文件格式简介 1&#xff09;XML文件的开头一般都有个声明&#xff0c;声明是可选 <&#xff1f;xml version"1.0" encoding"UTF-8"?>2&#xff09;根元素&#xff1a;XML文件最外层的元素 3&#xff…

java内置的数据结构

Java语言提供了许多内置的数据结构&#xff0c;包括&#xff1a; 1. 数组&#xff08;Array&#xff09;&#xff1a;数组是最基本的数据结构之一&#xff0c;它是一个有序的元素集合&#xff0c;每个元素都有一个对应的索引。在Java中&#xff0c;数组可以通过声明和初始化来创…

Docker使用2-Update the application

写在前面 主题是Update the application&#xff0c;这里是链接 更新项目 承接上个文章&#xff0c;这个文章主要是学习项目内容更新后重新构建image。 编辑上个项目的src/static/js/app.js文件&#xff0c;将第56行注释&#xff0c;添加下面的代码 <p className"…