04_记录锁

记录锁(Record Lock)

文章目录

    • 记录锁(Record Lock)
        • 简介
        • 原理
        • 加锁流程
        • 锁类型
        • 使用场景
        • 示例
        • 与其他锁的对比
        • 结论

简介

MySQL 中的记录锁(Record Lock)是行级锁的一种,用于锁定数据库表中的特定行。这种锁是 MySQL InnoDB 存储引擎提供的行级锁机制的一部分,直接作用于存储引擎层面的索引记录上,即锁定单个或多个行记录。

这种锁的主要目的是控制对单个数据行的并发访问,从而支持更高级别的事务隔离,并减少数据操作冲突,提高系统的并发能力,保证数据的一致性和完整性。


原理

当一个事务对某行加记录锁时,实际上是对该行的索引记录(主键索引)进行锁定。如果该表没有定义索引,InnoDB 会隐式创建一个聚簇索引(也称为主键索引),并基于该索引加锁。

当事务尝试修改数据时,InnoDB会自动在被修改的记录上加上排他锁(X锁)。当事务尝试读取数据并且事务隔离级别要求这样做时(如可重复读),InnoDB也可能在被读取的记录上加上共享锁(S锁)。


加锁流程
  1. 事务请求记录锁:事务发出对特定记录加锁的请求。
  2. 索引查找:通过索引找到需要锁定的记录。
  3. 加锁操作:对找到的索引记录加锁(共享锁或排他锁)。如果 SQL 中不是操作的主键索引,那么会通过其他索引来查找到记录,然后锁定记录的主键索引。
  4. 执行操作:持有记录锁的事务可以安全地对该记录进行读或写操作。
  5. 释放锁:事务提交或回滚后,释放记录锁。

锁类型

记录锁包括共享锁(S锁)和排他锁(X锁):

  • 共享锁(S锁):允许多个事务同时读取相同的记录,但不允许修改。
  • 排他锁(X锁):只允许一个事务读取或修改记录,其他事务不能同时读取或修改。

使用场景

记录锁主要在以下场景中使用:

  • 事务处理:在处理事务时,对需要修改的数据行加排他锁,对需要读取的数据行加共享锁(取决于隔离级别),以保证事务的ACID属性。
  • 并发控制:通过对不同行记录加锁,多个事务可以同时对不同的数据行进行操作,大大提高了数据库的并发处理能力。在并发读取场景下防止读操作读取到未提交的变更数据。
  • 避免更新冲突:在并发环境下,记录锁可以防止多个事务同时修改同一条记录,从而避免数据更新冲突。

示例

假设有一个表 users,包含以下数据:

CREATE TABLE users (id INT PRIMARY KEY,name VARCHAR(50),email VARCHAR(50)
);
  1. 事务1
START TRANSACTION;
-- 事务1在 id=1 的记录上加排他锁
SELECT * FROM users WHERE id = 1 FOR UPDATE;
  1. 事务2
START TRANSACTION;
-- 事务2尝试在 id=1 的记录上加共享锁,会被阻塞,等待事务1释放排他锁
SELECT * FROM users WHERE id = 1 LOCK IN SHARE MODE;

在以上示例中:

  • 事务1在 id=1 的记录上加了排他锁(X锁),因此其他事务不能同时读取或修改该记录。
  • 事务2尝试在 id=1 的记录上加共享锁(S锁),但由于记录已被事务1锁定,因此需要等待事务1释放锁后才能继续操作。

与其他锁的对比
锁类型锁定粒度适用范围并发性能使用场景
表锁表级别整个表DDL 操作、大批量更新
行锁(记录锁)行级别特定行(索引记录)高并发读写
意向锁表级别表明意向在某些行上加锁行锁和表锁混合使用
间隙锁行级别索引记录之间的间隙防止幻读
插入意向锁行级别索引记录之间的间隙高并发插入

结论

记录锁在 MySQL 中是实现行级别并发控制的重要机制,通过锁定特定记录来防止数据的并发修改,保证数据的一致性和完整性。在高并发访问场景中,记录锁提供了精细的并发控制能力,有助于提升系统的性能和可靠性。根据不同的需求和使用场景,可以选择合适的锁类型来实现最佳的并发控制策略。

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

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

相关文章

从零开始做题:老照片中的密码

老照片中的密码 1.题目 1.1 给出图片如下 1.2 给出如下提示 这张老照片中的人使用的是莫尔斯电报机,莫尔斯电报机分为莫尔斯人工电报机和莫尔斯自动电报机(简称莫尔斯快机)。莫尔斯人工电报机是一种最简单的电报机,由三个部分组…

SelfReg-UNet:解决UNet语义损失,增强特征一致性与减少冗余的优化模型

SelfReg-UNet:解决UNet语义损失,增强特征一致性与减少冗余的优化模型 提出背景拆解类比:整理书架语义一致性正则化内部特征蒸馏为什么 UNet 会有语义损失? 提出背景 论文:https://arxiv.org/pdf/2406.14896 代码&…

c++内存管理_复习

new与placement new new: 先调用operator new(大小),而operator new()会调用malloc尝试分配内存,失败则调用_callnewh()来释放内存,直至分配成功 可以设置分配失败的处理函数:将写好的处理函数作为参数传入set_new_han…

Vue3 使用 Vue Router 时,params 传参失效

前言: 在写项目的时候,使用了 vue-router 的 params 进行传参,但是在详情页面中一直获取不到参数。原因:Vue Router 在2022-8-22的那次更新后,使用这种方式在新页面上无法获取! 正文: 在列表页进…

deeplabcut

import pandas as pd import h5py import pickle import json import os # 读取 CSV 文件 csv_file_path /mnt/data/CollectedData_dlc.csv csv_data pd.read_csv(csv_file_path) # 读取 H5 文件 h5_file_path /mnt/data/CollectedData_dlc.h5 with h5py.File(h5_file_pat…

LeetCode题练习与总结:只出现一次的数字Ⅱ--137

一、题目描述 给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法且使用常数级空间来解决此问题。 示例 1: 输入:n…

K8S日常运维手册

Kubernetes(简称 K8S)是一种广泛使用的容器编排平台,能够自动化部署、扩展和管理容器化应用。对于运维人员来说,掌握 Kubernetes 的日常运维技能是确保系统稳定运行的关键。本文将介绍一些 Kubernetes 日常运维的基本操作与技巧&a…

虚拟机装入kali linux

VMware 首先需要先安装VMware Workstation Pro可以根据这篇文章来下载VMware 下载kali linux Installer Images VS Virtual Machines Installer Images(安装镜像)Virtual Machines(虚拟机) 直接访问硬件,定制内核…

Matlab|【防骗帖】考虑时空相关性的风电功率预测误差建模与分析

目录 1 主要内容 2 部分程序 3 下载链接 1 主要内容 这个程序《考虑时空相关性的风电功率预测误差建模与分析》画的图片非常漂亮,和原文献基本一致,但是实际上内容并未实现出来,主要就是利用现有的风电预测的数据和结果做了相关的图&#…

【数据结构】(C语言):链表

链表: 基本单位是节点。节点至少两部分:数据,下一个数据的地址。头指针head,始终指向链表的第一个节点。若没有节点,则headNULL。链表在内存中是非连续的。不能使用索引(下标)查找元素。只能从…

解决:Xshell通过SSH协议连接Ubuntu服务器报“服务器发送了一个意外的数据包,received:3,expected:20”

下图所示: 日志也基本看不出来问题在哪,只是说断开了连接大概是验证失败。有幸在某论坛评论区找到了原因,是因为我的xshell版本太低了而服务器的ssh版本太高,高版本的ssh默认屏蔽了一部分不太安全的算法导致建立连接的时候验证失败…

C++ 14新特性个人总结

variable templates 变量模板。这个特性允许模板被用于定义变量,就像之前模板可以用于定义函数或类型一样。变量模板为模板编程带来了新的灵活性,特别是在定义泛化的常量和元编程时非常有用。 变量模板的基本语法 变量模板的声明遵循以下基本语法&am…

解决Vue+Vite打包后Leaflet的marker图标不显示的问题

前言 用Leaflet写关于WebGIS的开发,用Vite或者webpack打包,打包后会找不到图标,如下所示。 直言的说,笔者去网上搜了搜,其实收到一个比较好是答案。网址如下。 (完美解决~)关于VueLeaflet添加…

eslint 与 prettier 的一些常见的配置项(很详细)

目录 1、eslint 常见配置项(语法规范) 2、 prettier 常见的配置项(格式规范) 代码规范相关内容看小编的该文章,获取对你有更好的帮助 vsCode代码格式化(理解eslint、vetur、prettier,实现格式…

IDEA启动报错:Abnormal build process termination...

一、问题描述 因为项目需要,同时打开了两个idea,突然发现一个启动的时候报错,有点莫名其妙,刚还好好的,为啥就不能用了,一顿百度找方法,试了各种方法,像重新安装jdk、重启系统发现都…

TensorFlow开源项目

欢迎来到 Papicatch的博客 文章目录 🍉TensorFlow介绍 🍉主要特点和功能 🍈多语言支持 🍈灵活的架构 🍈分布式训练 🍈跨平台部署 🍈强大的工具链 🍈丰富的社区和生态系统 &a…

c++基本数据类型和计算(一)习题讲解

1.【单选题】以下说法正确的是? A. unsigned 类型的值 最大为0xFFFFFFFF B. float类型的值大约有15位精度 C.bool类型占用4个字节 解析: 选项A:unsigned 类型的值 最大为 4个字节,正确。选项B: 因为float类型的值是单精度的浮…

Vue3基础使用

目录 一、创建Vue3工程 (一)、cli (二)、vite 二、常用Composition API (一)、setup函数 (二)、ref函数 (三)、reactive函数 (四)、setup注意事项 (五)、计算属性 (六)、watch (七)、watchEffect函数 (八)、生命周期 1、以配置项的形式使用生命周期钩子 2、组合式…

kafka-简单代码实现生产者消费者

生产者代码: package com.kafka.test;import org.apache.kafka.clients.producer.KafkaProducer; import org.apache.kafka.clients.producer.ProducerConfig; import org.apache.kafka.clients.producer.ProducerRecord; import org.apache.kafka.common.seriali…

【机器学习-10】 | Scikit-Learn工具包进阶指南:Scikit-Learn工具包之支持向量机模块研究

🎩 欢迎来到技术探索的奇幻世界👨‍💻 📜 个人主页:一伦明悦-CSDN博客 ✍🏻 作者简介: C软件开发、Python机器学习爱好者 🗣️ 互动与支持:💬评论 &…