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

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...

Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...

【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...

大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...

渗透实战PortSwigger靶场:lab13存储型DOM XSS详解
进来是需要留言的,先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码,输入的<>当成字符串处理回显到页面中,看来只是把用户输…...

论文阅读:Matting by Generation
今天介绍一篇关于 matting 抠图的文章,抠图也算是计算机视觉里面非常经典的一个任务了。从早期的经典算法到如今的深度学习算法,已经有很多的工作和这个任务相关。这两年 diffusion 模型很火,大家又开始用 diffusion 模型做各种 CV 任务了&am…...

AD学习(3)
1 PCB封装元素组成及简单的PCB封装创建 封装的组成部分: (1)PCB焊盘:表层的铜 ,top层的铜 (2)管脚序号:用来关联原理图中的管脚的序号,原理图的序号需要和PCB封装一一…...

Xcode 16 集成 cocoapods 报错
基于 Xcode 16 新建工程项目,集成 cocoapods 执行 pod init 报错 ### Error RuntimeError - PBXGroup attempted to initialize an object with unknown ISA PBXFileSystemSynchronizedRootGroup from attributes: {"isa">"PBXFileSystemSynchro…...