MySQL锁详解
锁是计算机在执行多线程或线程时用于并发访问同一共享资源时的同步机制,MySQL中的锁是在服务器层或者存储引擎层实现的,保证了数据访问的一致性与有效性。
MySQL锁:
- 按粒度分为:全局锁、表级锁、页级锁、行级锁。
- 按模式分为:乐观锁与悲观锁。
- 按属性分为:共享锁、排它锁。
- 按状态分为:意向共享锁、意向排它锁。
- 按算法分为:间隙锁、临键锁、记录锁。
1. 粒度锁
1.1 全局锁
全局锁是对整个数据库范围生效的锁。
在进行一些需要确保整个数据库一致性操作时可以使用全局锁,例如全库备份,全库导出等。
使用方法:
-- 加全局读锁
FLUSH TABLES WITH READ LOCK-- 释放锁
UNLOCK TABLES;
当对数据库加全局读锁后会阻塞其他会话中对该数据库的写操作。注意目前不存在明确的全局写锁
1.2 表级锁
表级锁是对表加锁,特点是开销小,加锁快,粒度大,冲突高,并发度低。
适用于
表级锁有表读锁和表写锁。
会使用表级锁的sql:
-- 给table_name1 加读锁,给table_name2加写锁
LOCK TABLES table_name1 READ, table_name2 WRITE;-- 释放锁
UNLOCK TABLES;
显示加锁
ALTER TABLE
这个命令用于更改表的结构会隐式添加表级写锁,如添加列、删除列、改变列的类型等。执行这个命令的时候,MySQL需要锁定整个表以防止在更改过程中有新的数据写入。
-- 清空表数据
TRUNCATE TABLE table_name;-- 删除表
DROP TABLE table_name;
这两个命令都会隐式添加表级写锁。DROP TABLE命令会删除整个表,而TRUNCATE TABLE命令会删除表中的所有数据.在执行这些命令的时候,MySQL需要锁定整个表以防止在删除过程中有新的数据写入。会在事务结束时自动释放。
1.3 行级锁
行级锁可以对数据库表中的单独一行进行锁定。相比于表级锁,行级锁的粒度更小,因此在处理高并发事务时,能提供更好的并发性能和更少的锁冲突。然而,行级锁也需要更多的内存和CPU资源,因为需要对每一行都进行管理.
行级锁分为共享锁(S锁,读锁)和排他锁(X锁,写锁)
注意:共享锁和共享锁能共存,排他锁和共享锁和排他锁不能共存
会发生行锁的sql:
SELECT ... FOR UPDATE
查询语句后加 FOR UPDATE 会对查询到的行加一个排他锁
SELECT ... LOCK IN SHARE MODE
查询语句后加 LOCK IN SHARE MODE 会对查询到的行加一个共享锁
INSERT ...
UPDATE ...
DELETE ...
这三类语句也对操作的行加排他锁
行级锁通常在事务内使用,事务提交后会自动释放事务内加的所有行级锁,注意不会释放全局锁和表级锁,如果在事务外使用了上述语句,MySQL其实会开启一个隐式的事务,直到语句结束,也就是语句执行完了就会立刻释放锁。
2. 乐观锁,悲观锁
乐观锁(Optimistic Locking)是一种在数据库操作中用于处理并发问题的技术。它的基本思想是假设在多个事务同时访问同一条数据时,冲突发生的概率较低,因此在操作数据时不会立即进行锁定,而是在提交数据更改时检查是否有其他事务修改了这条数据。如果没有,就提交更改,否则就回滚事务。
在MySQL中,乐观锁并没有内置的实现,但是可以通过一些编程技巧来实现。一种常见的实现方式是使用版本号(或时间戳)字段。每当一条记录被修改时就增加版本号(或更新时间戳)。在更新记录时,先检查版本号(或时间戳)是否和读取记录时的版本号(或时间戳)一致,如果一致则执行更新并增加版本号(或更新时间戳),否则就拒绝更新。
UPDATE your_table SET name = 'New Name', version = version + 1
WHERE id = 1 AND version = expected_version;
这样就可以保证只有当记录没有被其他事务修改时,当前事务的更改才会被提交乐观锁的优点在于,由于大部分时间都不需要锁定,所以在冲突较少的情况下可以获得较高的并发性能。然而,如果冲突较多,那么乐观锁可能会导致大量的事务回滚,从而影响性能。因此,选择使用乐观锁还是其他锁定技术,需要根据实际的并发情况和性能需求来决定。
优点:
- 不会阻塞其他事务的读取操作,提高了数据库的并发性能。
- 适用于读操作频繁、写操作相对较少的场景。
缺点:
- 如果并发冲突频繁,会导致大量的回滚和重试操作,降低系统性能。
- 需要应用程序逻辑来确保乐观锁的正确实现,增加了开发和维护的复杂性。
悲观锁:我们上面介绍的行级锁就是一种悲观锁
3. 意向锁
意向锁分为意向共享锁和意向排他锁 ,意向锁是一个表级锁
当某个事务添加行锁时会自动添加一个意向锁,类型取决于行锁的类型。
当表被加了意向锁,其他事务想要对表加锁就不用一行一行遍历查看是否存在行锁,只需查一次意向锁即可,提高了效率
4. 间隙锁,记录锁,临键锁
间隙锁,临键锁,记录锁都是行锁
4.1 间隙锁
间隙锁锁定的是行与行之间的间隙,间隙锁的存在,主要是为了解决幻读问题。所谓幻读,是指在一个事务内读取某个范围的记录时,另外一个事务在该范围内插入了新的记录,当第一个事务再次
读取该范围的记录时,会发现有些原本不存在的记录,这就是幻读。
间隙锁只在可重复读及序列化级别下使用,并且查询条件使用的索引字段才可能加间隙锁
1. 范围查询:
SELECT * FROM your_table WHERE id BETWEEN 10 AND 20 FOR UPDATE;
这条语句会在 id 列的值为 10 到 20 之间的每一行数据上设置间隙锁。具体来说,MySQL会在 id 值为 10 和 20 之间的数据行的间隙上设置锁,以防止其他事务在这个范围内插入新的数据行。
2. 唯一索引扫描:
SELECT * FROM your_table WHERE unique_column = 100 FOR UPDATE;
如果 unique_column 是一个唯一索引列,MySQL会在 unique_column 等于 100 的数据行上加锁。同时,如果 unique_column 列上不存在值为 100 的行,MySQL 也会在唯一索引中对值为 100 的位置加锁,以防止其他事务在这个位置插入新数据。
3. 非唯一索引范围查询:
SELECT * FROM your_table WHERE non_unique_index_column BETWEEN 50 AND 100 FOR UPDATE;
这条语句会在 non_unique_index_column 列的值在 50 和 100 之间的每一行数据上设置间隙锁。MySQL会在 non_unique_index_column 值为 50 和 100 之间的数据行的间隙上设置锁,以防止其他事务在这个范围内插入新的数据行。
4.2 记录锁
记录锁就是我们上面讲行级锁对单行记录锁定,防止其他事务更新的锁:
4.3 临键锁
临键锁可以理解为间隙锁加记录锁,其他事务既不能更改锁定的数据,也不能插入
每个数据行上的非唯一索引列上都会存在一把临键锁,当某个事务持有该数据行的临键锁时,会锁住一段左开右闭区间的数据。需要强调的一点是,IoDB中行级锁是基于索实现的,临键锁只与非唯一索引列有关,在唯一索引列(包括主键列)上不存在临键锁。
假设现在某表上存在 非唯一索引列数据[12, 24, 32, 68]
那么存在临键锁(-∞, 12], (12, 24], (24, 32], (32, 68], (68, +∞]
如果使用 SELECT ... FOR UPDATE 语句查询时,事务会获取查询到数据相邻的临键锁。
例如查询了 24 会获取(12, 24], (24, 32]的临键锁,此时其他事务不能修改该范围的值,也不能插入[12, 33]区间的值
相关文章:
MySQL锁详解
锁是计算机在执行多线程或线程时用于并发访问同一共享资源时的同步机制,MySQL中的锁是在服务器层或者存储引擎层实现的,保证了数据访问的一致性与有效性。 MySQL锁: 按粒度分为:全局锁、表级锁、页级锁、行级锁。按模式分为&…...
面试问题记录:
1,hashmap扩容的时候,链表超长但不满足转变成红黑树的条件时: 【HashMap】链表和红黑树互相转换的几种情况和数组的扩容机制_hashmap红黑树转链表条件-CSDN博客 2,cglib与proxy区别 JDK 动态代理和 CGLIB 动态代理对比_动态代理…...
vue如何在组件中监听路由参数的变化
使用 watch 监听 $route 对象 的变化,从而捕捉路由参数的变化 beforeRouteUpdate 导航守卫 当前组件路由更新时调用 beforeRouteUpdate 钩子只在组件被复用时调用,即当组件实例仍然存在时。如果组件是完全重新创建的,那么应该使用 beforeR…...
antd中form表单校验文件上传
antd中文件上传需要单独设置this.model中得数据 this.$set(this.model, filePath,上传成功后返回得文件路径地址)...
商家转账到零钱2024最新开通必过攻略
微信支付商家转账到零钱功能申请设置了人工审核的门槛,本意是为了防止没有合规使用场景的商户滥用该功能,但这也让相当多的真实用户被一次次拒之门外。结合过去6年开通此类产品的经验,今天我们就以2024年最新的的商家转账到零钱的开通流程做一…...
2024全新Thinkphp聊天室H5实时聊天室群聊聊天室自动分配账户完群组/私聊/禁言等功能/全开源运营版本
全开源运营版本聊天室H5实时聊天室群聊聊天室自动分配账户完群组/私聊/禁言等功能 运营版本的聊天室,可以添加好友,建立群组,私聊,禁言功能 H5TP5.0mysqlPHP 源码开源不加密...
(一)javascript中class类
在 JavaScript 中使用 class 语法可以定义类的结构,其中可以包括静态属性/方法、私有属性/方法、公共属性/方法和受保护属性/方法。这些概念有助于封装和数据隐藏,使得代码更加模块化和安全。下面我会解释这些不同的属性和方法,以及如何在类中…...
【注意力MHA,MQA,GQA,MLA】
注意力机制优化简明图解 1. 多头注意力(MHA) 图示: Input --> [Attention Head 1]--> [Attention Head 2]--> [Attention Head 3]--> ...--> [Attention Head N]--> [Concatenate] --> Output公式: Outpu…...
《从零开始做个摸鱼小网站! · 序》灵感来源
序 大家好呀,我是summo,这次来写写我在上班空闲(摸鱼)的时候做的一个小网站的事。去年阿里云不是推出了个活动嘛,2核2G的云服务器一年只要99块钱,懂行的人应该知道这个价格在业界已经是非常良心了,虽然优惠只有一年&a…...
计算机基础(Windows 10+Office 2016)教程 —— 第5章 文档编辑软件Word 2016(上)
文档编辑软件Word 2016 5.1 Word 2016入门5.1.1 Word 2016 简介5.1.2 Word 2016 的启动5.1.3 Word 2016 的窗口组成5.1.4 Word 2016 的视图方式5.1.5 Word 2016 的文档操作5.1.6 Word 2016 的退出 5.2 Word 2016的文本编辑5.2.1 输入文本5.2.3 插入与删除文本5.2.4 复制与移动文…...
短视频矩阵管理系统源码:实现短视频内容全面布局
随着移动互联网的普及,短视频应用逐渐成为人们获取信息、娱乐休闲的重要途径。为了满足用户多样化需求,实现短视频内容的全面布局,短视频矩阵管理系统应运而生。本文将详细介绍短视频矩阵管理系统的源码实现,帮助您更好地理解并应…...
系统设计中15 个最重要的权衡
系统设计的第一法则:一切都与权衡有关。 在设计系统时,我们需要决定要包含哪些功能以及要忽略哪些功能。每次我们做这个决定时,我们都在进行权衡。在本文中,我们将探讨系统设计中遇到的15个最常见的权衡问题,并使用实…...
12年外贸实战经验,一定对你有帮助!
更多外贸干货及开发客户的方法,尽在微信【千千外贸干货】 NO1 客户总是抱怨价格太高,我常以我们产品质量过硬作为回应。但自从我进入贸易公司后,才真正意识到,在商业世界里,价格才是王道。 NO2 如果顾客提出要去工厂检…...
Linux---进程(3)---进程状态
目录 进程排队 进程状态 运行状态 阻塞状态 挂起状态 Linux内核具体进程状态 浅度睡眠状态 运行状态 深度睡眠状态 暂停状态 可被追踪的暂停状态 终止状态 僵尸状态 进程排队 进程不是一直在运行的,进程放在了CPU上,也不是一直运行的。 进程…...
Drools规则引擎实现停车计费
业务规则: 20:00至次日7时不收费白天7:00-20:00每小时5元,每半个小时计费一次进场30分钟内不收费,但计入时间每天最高收费50元 测试项目搭建 pom<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/…...
【python虚拟环境】安装第三方包失败/failed with error code1
问题: 今天新建了一个项目,默认的虚拟环境pip包版本是19.0.3,太低了。安装第三方包的时候一直超时 解决方案: 更新pip: python -m pip install -U --force-reinstall pip然后就可以正常pip install包了 清华镜像源࿱…...
DiffusionModel-latent diffusion,VAE,U-Net,Text-encoder
Diffusers StableDdiffusion 参考: Stable Diffusion原理详解(附代码实现) Latent Diffusion 自编码器(Variational Autoencoder, VAE): 自编码器是一种无监督学习的神经网络,用于学习数据的有效表示或编码。在稳定扩…...
C# form的移植工作
前言: 目标,将一个项目的form移植到新的工程下,且能够正确编译执行: 1 Copy form的两个文件到新工程下: 比如笔者的logo form 2 修改命名空间: 然后,找到新项目的主程序: 的命名…...
linux防火墙相关命令
防火墙启动关闭 启动防火墙 systemctl start firewalld 关闭防火墙 systemctl stop firewalld 查看状态 systemctl status firewalld 开放或限制端口 开放端口 firewall-cmd --zonepublic --add-port22/tcp --permanent 重新载入一下防火墙设置,使设置生效…...
实习中学到的一点计算机知识(MP4在企业微信打不开?)
我在实习中,常有同事向我反馈说我在微信发的视频格式打不开。这就导致我还要一帧帧的盯着某一个时刻来截图,今天查了一下资料尝试修改视频后缀来解决视频的播放问题。 在网上下载mp4的格式,在本地都能播放,怎么可能发上企业微信就…...
XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...
Linux离线(zip方式)安装docker
目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1:修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本:CentOS 7 64位 内核版本:3.10.0 相关命令: uname -rcat /etc/os-rele…...
