数据库学习(三)——MySQL锁

一、MySQL锁

当多个用户或进程并发操作数据库时,为了避免数据冲突、脏读、不可重复读、幻读等问题,数据库通过锁机制来保证数据的一致性完整性

MySQL 锁的总体分类:

分类维度类型说明
按作用对象表级锁(Table Lock)锁住整张表
行级锁(Row Lock)锁住一行数据
按锁粒度全局锁、数据库锁、表锁、行锁粒度逐级细化
按加锁方式共享锁(S锁)允许读,不允许写
排他锁(X锁)允许写,其他读写都被阻塞
按使用方式显式锁、隐式锁手动加锁 or 自动加锁
按存储引擎实现不同引擎的锁实现机制不同InnoDB vs MyISAM

二、MySQL 中的锁类型

1. 表级锁(Table Lock)

  • 作用于整张表
  • 典型场景:MyISAM 存储引擎、ALTER TABLELOCK TABLES
  • 效率高、开销小,但并发性差。

示例:

-- 给表 user 加上 写锁(WRITE LOCK)。
LOCK TABLES user WRITE;
-- 操作
UNLOCK TABLES;

2. 行级锁(Row Lock)

  • 作用于某一行数据
  • InnoDB 引擎支持,适合高并发读写场景;
  • 粒度小,并发性好,但管理成本高。

示例——隐式加锁:

BEGIN;
SELECT * FROM orders WHERE id = 10 FOR UPDATE; -- X锁
COMMIT;

3. InnoDB 的事务级锁(最常用)

(1)共享锁(S锁, Shared Lock)

  • 多个事务可以并发加 S 锁,读取数据;
  • 但不能加 X 锁,写操作会被阻塞。

示例:

SELECT * FROM products WHERE id=1 LOCK IN SHARE MODE;

注意:

  • 为查询到的行加上共享锁(S锁),直到事务结束(提交或回滚)。

(2)排他锁(X锁, Exclusive Lock)

  • 独占锁:读写都阻塞其他事务;
  • 常用于修改数据。

示例:

SELECT * FROM products WHERE id=1 FOR UPDATE;

注意:

  • 查询的同时,对满足条件的记录加排他锁,防止其他事务对该记录进行修改或加锁读取。

(3)意向锁(Intention Lock)

  • InnoDB 自动加的表级锁,用于指示事务是否准备加行锁;
  • 无需手动操作;
  • 分为:意向共享锁(IS)意向排他锁(IX)

4. 其他特殊类型

(1)Gap Lock(间隙锁)

  • 锁住的是数据之间的“间隙”防止幻读
  • 例如:SELECT * FROM t WHERE age > 30 FOR UPDATE;

(2)Next-Key Lock(记录锁 + 间隙锁)

  • InnoDB 默认的锁,避免幻读;
  • 锁住“记录本身 + 相邻间隙”。

(3)自增长锁(Auto-Inc Lock)

  • 针对 AUTO_INCREMENT 字段的内部锁
  • 防止并发插入冲突。

三、锁的工作原理(以 InnoDB 为例)

  • 当事务执行写操作时,InnoDB 会在相关行上加排他锁(X锁)
  • 读操作默认不加锁(基于 MVCC 实现快照读),除非使用 SELECT ... FOR UPDATELOCK IN SHARE MODE 强制加锁。
  • 当一个事务对某行加了 X 锁,其他事务必须等待锁释放后才能访问该行。

四、常见锁相关语句

  • SELECT ... FOR UPDATE:对查询到的行加排他锁。
  • SELECT ... LOCK IN SHARE MODE:对查询到的行加共享锁。
  • LOCK TABLESUNLOCK TABLES:对表加锁和解锁(表锁)。

五、常见问题

1. 死锁(Deadlock)

  • 多个事务互相等待对方持有的锁,导致程序无限等待。

  • InnoDB 能自动检测死锁,并回滚其中一个事务。

  • 解决策略:

    • 保持事务尽量短小
    • 尽量避免长时间锁住资源
    • 按照固定顺序访问表和行。

2. 脏写(Dirty Write)

定义:
一个事务写入了另一个未提交事务修改的数据,这会导致数据污染或逻辑错误

示例:

-- 事务A:
BEGIN;
UPDATE users SET name = 'Alice' WHERE id = 1;-- 事务B 在事务A未提交时:
BEGIN;
UPDATE users SET name = 'Bob' WHERE id = 1;

注意:

  • 如果数据库允许这样操作,就是脏写。
  • 假如事务A回滚了,但事务B的修改已提交,数据将不一致。

解决:

  • MySQL InnoDB 的默认隔离级别 REPEATABLE READ 已避免脏写。
  • 即使设置为 READ COMMITTED,也不允许脏写。

3. 幻读(Phantom Read)

定义:
在同一个事务中,前后两次相同条件的查询,返回的记录数不一样,即第二次出现了“幻影”数据。

示例:

-- 事务A:
BEGIN;
SELECT * FROM orders WHERE amount > 1000;-- 事务B 插入新数据:
INSERT INTO orders(amount) VALUES(2000); -- 满足条件-- 事务A 再次执行:
SELECT * FROM orders WHERE amount > 1000;
-- 返回了比上次多一行

注意:

  • READ COMMITTEDREPEATABLE READ 级别下会出现幻读。

六、锁的隔离级别

隔离级别说明是否使用行锁
READ UNCOMMITTED允许脏读无锁或极少
READ COMMITTED不允许脏读读操作不加锁(快照读)
REPEATABLE READ可重读InnoDB 默认隔离级别读操作快照读,写操作加行锁
SERIALIZABLE串行化,最高隔离级别,所有读操作加锁读写都加锁

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

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

相关文章

<3>-MySQL表的操作

目录 一,创建表 二,查看表结构 三,修改表 四,删除表 一,创建表 语法: CREATE TABLE table_name ( field1 datatype, field2 datatype, field3 datatype ) character set 字符集 collate 校验规则 eng…

【OSG学习笔记】Day 15: 路径动画与相机漫游

本章来学习下漫游相机。 路径动画与相机漫游 本届内容比较简单,其实就是实现物体的运动和相机的运动 当然这两个要一起执行。 贝塞尔曲线 贝塞尔曲线(Bzier curve)是一种在计算机图形学、动画制作、工业设计等领域广泛应用的参数曲线&am…

LabVIEW自感现象远程实验平台

LabVIEW开发自感现象远程实验平台,通过整合 NI数据采集设备、菲尼克斯(Phoenix Contact)继电器模块及罗技(Logitech)高清摄像头,实现远程数据采集、仪器控制与实时监控三大核心功能。平台突破传统实验装置局…

数据结构——F/图

一、图的基本概念 图是由顶点集合及顶点间的关系组成的一种数据结构&#xff1a;G (V&#xff0c; E)&#xff0c;其中&#xff1a; 顶点集合V {x|x属于某个数据对象集}是有穷非空集合&#xff1b; E {(x,y)|x,y属于V}或者E {<x, y>|x,y属于V && Path(x, y)…

springcloud openfeign 偶现 Caused by: java.net.UnknownHostException

背景 最近查看日志发现某服务偶现Caused by: java.net.UnknownHostException 同时查看eureka的access.log 出现如下异常 10.xxx.xxx.xxx - - [27/May/2025:23:57:29 0800] “PUT /eureka/apps/{appName}/{host}:xxx-job:8082?statusUP&lastDirtyTimestamp1748351637173 H…

第12篇:数据库中间件日志设计与追踪系统落地实践

12.1 引言&#xff1a;中间件日志系统为何如此关键&#xff1f; 数据库中间件作为连接前端应用与后端数据库的“网关”&#xff0c;承载着路由、负载均衡、SQL 改写、权限控制等复杂逻辑。 在出现 性能问题、故障排查、安全审计 等场景中&#xff0c;若没有完善的日志体系&am…

OpenAI对抗法庭命令:捍卫ChatGPT用户隐私之战

人工智能公司OpenAI近期正积极对抗一项涉及隐私问题的法庭命令。该命令要求OpenAI保留所有ChatGPT用户日志&#xff0c;包括已删除的对话记录以及通过API调用生成的聊天内容。 命令背后的真实动机 值得注意的是&#xff0c;法院发布这一指令并非出于对用户隐私或内容安全的考…

嵌入式学习--江协stm32day5

USART 1. 引脚与接口层 异步引脚&#xff1a; TX&#xff1a;发送数据输出&#xff1b;RX&#xff1a;接收数据输入&#xff1b;SW_RX&#xff1a;单线半双工模式的接收引脚&#xff08;替代 RX&#xff09;。 同步引脚&#xff1a;SCLK&#xff1a;同步模式下的时钟输出&…

使用Fiddler抓包

有时候需要跟踪一些小程序的HTTP请求&#xff0c;但是无法像浏览器一样F12查看请求&#xff0c;因此需要借助其他的工具进行&#xff0c;在这里推荐使用Fiddler 配置 此时检查系统代理已经变成如下配置&#xff1a; 抓包 此时随便打开一个小程序&#xff0c;就可以进行抓包…

python学习打卡day47

DAY 47 注意力热图可视化 昨天代码中注意力热图的部分顺移至今天 知识点回顾&#xff1a; 热力图 作业&#xff1a;对比不同卷积层热图可视化的结果 # 可视化空间注意力热力图&#xff08;显示模型关注的图像区域&#xff09; def visualize_attention_map(model, test_loader,…

MySQL-运维篇

运维篇 日志 错误日志 错误日志是 MySQL 中最重要的日志之一&#xff0c;它记录了当 mysqld 启动和停止时&#xff0c;以及服务器在运行过程中发生任何严重错误时的相关信息当数据库出现任何故障导致无法正常使用时&#xff0c;建议首先查看此日志。 该日志是默认开启的&am…

Prompt Tuning(提示调优)到底训练优化的什么部位

Prompt Tuning(提示调优)到底训练优化的什么部位 在自然语言处理(NLP)领域,Prompt Tuning(提示调优)是一种轻量级的模型优化技术,其核心目标是通过优化提示(Prompt)来引导预训练语言模型(如GPT、BERT等)更好地完成特定任务,而无需大规模调整模型的主体参数。 一…

基于FPGA的超声波显示水位距离,通过蓝牙传输水位数据到手机,同时支持RAM存储水位数据,读取数据。

基于FPGA的超声波显示水位距离 前言一、整体框架二、代码架构1.超声波测距模块2.蓝牙数据发送模块3.数码管数据切换模块4.数码管驱动模块6.串口驱动7.顶层模块8.RAM ip核 仿真相关截图 前言 随着工业化进程的加速和环境保护意识的提升&#xff0c;对水资源管理和水位监测的需求…

OD 算法题 B卷【水果摊小买卖】

文章目录 水果摊小买卖 水果摊小买卖 小王手里有点闲钱&#xff0c;想做点水果买卖&#xff0c;给出两个数组m, n&#xff0c; m[i]表示第i个水果的成本价&#xff0c;n[i]表示第i个水果能卖出的价格&#xff1b;假如现在有本钱k&#xff0c;试问最后最多能赚多少钱&#xff1…

(新手友好)MySQL学习笔记(6):分组查询,正则表达式

目录 分组查询 创建分组 过滤分组 分组查询练习 正则表达式 匹配单个实例 匹配多个实例 正则表达式练习 练习答案 分组查询练习答案 正则表达式练习答案 分组查询 创建分组 group by 子句&#xff1a;根据一个或多个字段对结果集进行分组&#xff0c;在分组的字段上…

Android 之 kotlin 语言学习笔记四(Android KTX)

一、Android KTX 简介 Android KTX 是包含在 Android Jetpack 及其他 Android 库中的一组 Kotlin 扩展程序。KTX 扩展程序可以为 Jetpack、Android 平台及其他 API 提供简洁的惯用 Kotlin 代码。为此&#xff0c;这些扩展程序利用了多种 Kotlin 语言功能&#xff0c;其中包括&…

云原生思维重塑数字化基座:从理念到实践的深度剖析

&#x1f4dd;个人主页&#x1f339;&#xff1a;慌ZHANG-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 一、引言&#xff1a;云原生为何成为数字化的“基础设施语言”&#xff1f; 随着5G、人工智能、物联网等技术逐步进入规模化落地阶段&am…

【C/C++】STL实现版本为什么比手写版本高?

文章目录 为什么标准库版本效率更高&#xff1f;1 具体介绍1.1 **内联优化&#xff08;Inlining&#xff09;和模板展开**1.2 **分支预测友好&#xff08;Branch Prediction&#xff09;**1.3 **迭代器解耦 静态分发**1.4 **代码紧凑&#xff0c;编译器优化空间大**1.5 **高质…

35.成功解决编写关于“江协科技”编写技巧第二期标志位积累的问题

江科大学长又发布了第二期的编写技巧&#xff01; 大家可以看看&#xff1a;https://space.bilibili.com/383400717 最后面给了一个未完成的任务&#xff1a; 这里我已经把这个问题给解决了&#xff01; 总代码放在资源里面&#xff0c;key.c放在文章最后面&#xff01;同时感…

STM32什么是寄存器

提示&#xff1a;文章 文章目录 前言一、背景二、2.12.2 三、3.1 总结 前言 前期疑问&#xff1a; 1、什么是寄存器&#xff1f; 答&#xff1a;在4GB的地址空间中&#xff0c;512MB的block2上&#xff0c;每4个字节组成32位&#xff0c;这个32位为一个单元&#xff0c;控制&a…