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的格式,在本地都能播放,怎么可能发上企业微信就…...

接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...

使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...

Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...