MySQL 锁机制:数据库的交通管制系统

news/2025/4/2 2:54:00/文章来源:https://www.cnblogs.com/geeklab/p/18801567

MySQL 锁机制:数据库的"交通管制系统" 🚦

在数据的高速公路上,没有红绿灯会怎样?一片混乱!MySQL 的锁机制就是数据库世界的交通规则...

什么是锁机制?🤔

锁机制是数据库用来控制并发访问的一种方式,确保在多人同时操作数据库时不会出现数据不一致或损坏。简单来说:锁就是数据库的"禁止通行"标志,防止多个操作同时修改同一条数据而引发混乱。

MySQL 的三大锁类型 🔒

1️⃣ 表锁(Table Lock) - "全城交通管制"

场景:城市大型活动
交警:"今天主干道全部封闭,所有车辆绕行!"
表中数据:"我们都不能动了!"
DBA:"这样做是为了安全,但效率确实低..."

特点

  • 锁定整张表,粒度最大
  • 实现简单,开销小
  • 并发性能最差
  • MyISAM 存储引擎的默认锁

使用场景

-- 手动加表锁
LOCK TABLE employees READ;  -- 读锁,所有人都只能读
LOCK TABLE employees WRITE; -- 写锁,除加锁者外都不能读写-- 解锁
UNLOCK TABLES;

2️⃣ 行锁(Row Lock) - "单车道维修"

场景:道路修补
施工员:"只修这一条车道,其他车道正常通行!"
数据行:"只有我被锁定,其他数据可以自由访问!"
应用程序:"太好了,我可以同时处理多条记录!"

特点

  • 锁定单行数据,粒度最小
  • 实现复杂,开销大
  • 并发性能最好
  • InnoDB 存储引擎的默认锁

使用场景

-- 通过事务隐式加行锁
START TRANSACTION;
UPDATE employees SET salary = 10000 WHERE emp_id = 101; -- 只锁定emp_id=101的行
COMMIT; -- 提交事务,释放锁

3️⃣ 间隙锁(Gap Lock) - "预防性交通管制"

场景:交通管制
交警:"虽然这段路目前没车,但为防止突然涌入,先封了!"
数据库:"我要锁定ID 5到10之间的范围,即使这里现在没有数据!"
开发者:"等等,这些数据明明不存在,为什么要锁?"
DBA:"为了防止幻读啊,小伙子!"

特点

  • 锁定一个范围,但不包括记录本身
  • 特殊条件下 InnoDB 使用(可重复读隔离级别)
  • 目的是防止幻读

锁的模式:读锁与写锁 🔄

🔍 共享锁(S 锁/读锁) - "观光模式"

游客甲:"我可以看这个景点,但不能改变它!"
游客乙:"我也可以同时看!"
开发者丙:"但我想修改它…" (被拦住)

特点:允许多个事务同时读取数据,但阻止其他事务获取写锁

-- 显式加共享锁
SELECT * FROM employees WHERE emp_id = 101 LOCK IN SHARE MODE;

✏️ 排他锁(X 锁/写锁) - "施工模式"

施工队:"我们正在改造这个区域,闲杂人等禁止入内!"
游客:"那我们什么时候能参观?"
施工队:"等我们完工后,谢谢合作!"

特点:防止其他事务读取或写入数据,独占资源

-- 显式加排他锁
SELECT * FROM employees WHERE emp_id = 101 FOR UPDATE;

死锁:数据库的"交通堵塞" ⚠️

当两个或多个事务互相等待对方释放锁,形成循环等待时,就发生了死锁。

事务A:"我锁了资源1,现在需要资源2才能继续..."
事务B:"我锁了资源2,现在需要资源1才能继续..."
两者:"那我们就这样一直等着吧..." (系统陷入死锁)
MySQL:"检测到死锁!必须有人让路,事务A你回滚吧!"

死锁简易示例

-- 事务A
START TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
-- 此时事务A持有id=1的锁,等待id=2的锁-- 事务B
START TRANSACTION;
UPDATE accounts SET balance = balance - 200 WHERE id = 2;
-- 此时事务B持有id=2的锁,等待id=1的锁
UPDATE accounts SET balance = balance + 200 WHERE id = 1;-- 事务A继续
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
-- 死锁!事务A等待事务B释放id=2的锁,事务B等待事务A释放id=1的锁

避免死锁的交通规则 🚗

  1. 固定顺序访问资源 - 所有事务按相同顺序访问资源(车辆靠右行驶原则)

  2. 缩短事务时间 - 事务越长,越容易与其他事务冲突(快速通过收费站)

  3. 一次性锁定所需资源 - 减少持锁等待(提前规划好路线)

  4. 使用低隔离级别 - 在允许的情况下降低隔离要求(适当放宽交通规则)

  5. 合理设计索引 - 减少锁定范围(修建更多车道)

锁争用的监控 🔍

想知道谁堵塞了交通?MySQL 提供了工具:

-- 查看当前锁等待情况
SELECT * FROM information_schema.innodb_lock_waits;-- 查看锁详情
SELECT * FROM information_schema.innodb_locks;-- 查看哪些事务正在运行
SELECT * FROM information_schema.innodb_trx;

乐观锁与悲观锁:处理拥堵的两种心态 🧠

悲观锁 - "交通肯定会很差"

悲观司机:"路上肯定堵车,我先占个车道!"
数据库:"没问题,这条数据锁定给你了,其他人都靠边站!"

特点:先锁定,后操作,适合高并发写入

乐观锁 - "相信交通会很好"

乐观司机:"应该不会堵,我先开着,遇到问题再说!"
数据库:"好,不锁定,但如果数据变了,你的操作就失败!"

特点:不锁定,通过版本号或时间戳检查冲突,适合读多写少

-- 乐观锁的伪代码实现
SELECT version, balance FROM accounts WHERE id = 1;
-- 应用层计算新余额...
UPDATE accounts SET balance = new_balance, version = version + 1
WHERE id = 1 AND version = old_version;
-- 如果version已变,则更新失败,需要重试

"在并发的十字路口,锁是最严厉但也最公正的交通警察,它可能让你多等一会儿,但确保了所有人最终都能安全到达目的地。"

—— 资深数据库管理员


下次面试官问你 MySQL 锁机制,别紧张!记住:那不过是在考查你如何理解数据库的交通规则而已!🚦

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

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

相关文章

揭秘AI自动化框架Browser-use(四):Browser-use记忆模块技术解析

在 AI 自动化任务中,记忆模块是实现复杂任务处理的关键组件。Browser-use 项目通过引入记忆模块,解决了 LLM 在连续性任务中的无状态性问题,使代理能够维持上下文连贯性,执行复杂多步骤任务,并从错误中学习和恢复。一、从一次失败的景点采集说起 在 AI 自动化任务中,记忆…

微软Dynamics 365Power Platform技术找工作|宝藏岗位+金饭碗+高薪潜力

【简单介绍】‌ (长沙爱码士IT培训是一家专门培训微软Dynamics 365 CRM和Power Platform技术的一家公司www.aimashi365.com)本人是长沙爱码士IT的金牌讲师,已经帮助上百位学员找到IT工作,对训微软Dynamics 365 CRM和Power Platform技术有兴趣的朋友,我们可以随时沟通交流。…

差分约束学习笔记

一.差分约束系统 如果一个系统有 \(n\) 个变量 \(x_1,x_2,,x_n\) 和 \(m\) 个约束条件(也是不等式)和\(m\) 个常量 \(w_1,w_2,,w_m\)。每一个不等式形如以下格式 \(x_i - x_j \le w_k\)(\(1 \le i,j \le n\),\(1 \le k \le m\))。则称之为差分约束系统。 这个名字的由来是…

9.6K+ Star!一个基于 SpringBoot + Vue3 的工作流引擎快速开发平台!

mldong —— 一个基于 SpringBoot + Vue3 实现的工作流引擎快速开发平台,采用前后端分离的模式,内置完整的权限架构。大家好,我是 Java陈序员。 今天,给大家介绍一个基于 SpringBoot + Vue3 的工作流引擎快速开发平台!关注微信公众号:【Java陈序员】,获取开源项目分享、…

搭建开源笔记平台:outline

折腾的意义 为什么要自己搭建一个笔记平台?没理由,就是突然想试试。有时候突然有个想法,搜了一下正好有合适的方案,就顺手试一下。其实已经有很多成熟的笔记软件,例如Notion/OneNote,但谁不想要一个数据完全在自己服务器的笔记呢。 开始搭建 这个搭建是真的麻烦,需要一堆…

useDeferredValue的作用

前言 useDeferredValue是react18新增的一个用于优化性能的一个hook,它的作用是延迟获取一个值,实际开发中的常规用法与我们之前所用的防抖和节流很相似,但是也有一定的区别。本篇文章我们就逐步分析它的设计原理和用法,并且讨论它与防抖节流的区别和它自身的优势。在讨论us…

Spring AI 增加混元 embedding 向量功能

上次我们讨论了如何将自己的开源项目发布到 Maven 中央仓库,确保其能够方便地被其他开发者使用和集成。而我们的项目 spring-ai-hunyuan 已经具备了正常的聊天对话功能,包括文本聊天和图片理解等基础功能。今天,我们进一步优化和扩展了该项目,新增了一个向量化功能。如图所…

如何选择合适的数据同步软件,提升企业业务效率和数据管理能力?

数据同步软件对企业提升决策效率、优化客户体验、保障运营稳定性等诸多方面都有显著好处,可以实时洞察业务状况,及时发现问题与机会,提升风险控制能力,保障数据一致性,优化资源配置,促进团队协作。一、应用场景 通常金融、电商、医疗、制造等行业的企业会有数据同步的需求…

2. RabbitMQ 的详细安装步骤(两种方式,第一种:yum 安装;第二种:docker 容器安装)

2. RabbitMQ 的详细安装步骤(两种方式,第一种:yum 安装;第二种:docker 容器安装) @目录2. RabbitMQ 的详细安装步骤(两种方式,第一种:yum 安装;第二种:docker 容器安装)1. 第一种方式:yum 安装 RabbitMQ 的详细步骤:1.1 安装 RabbitMQ web 管理插件1.2 在 RabbitMQ …

20244221李留斌《python程序设计》实验报告

20244104 2024-2025-2 《Python程序设计》实验x报告 课程:《Python程序设计》 班级:2442 姓名:李留斌 学号:20244221 实验教师:王志强 实验日期:2025年3月23日 必修/选修: 公选课 一、实验内容 1.熟悉Python开发环境; 2.练习Python运行、调试技能; 3.编写程序,练习…

【分享】Ftrans内外网文件摆渡系统:让数据传输更安全更可靠!

随着大数据时代的到来,数据的重要性日渐得到重视,数据作为数字经济时代下的基础性资源和战略性资源,是决定国家经济发展水平和竞争力的核心驱动力。以行业为维度来看,数据泄露已发生在并影响了各个行业,全球范围内,各行业发生数据泄露的数量和损失都在增加。很多企业为了…

地球无法承受 AI,是时候踩刹车了

作者:Kollibri terre Sonnenblume公有领域艺术作品,作者提供,来自公共领域元素。**前言: **如果你不想阅读完整篇,这里是本篇的作者的核心观点:人工智能(AI)虽然在技术上有巨大的潜力,但它对环境的负面影响极其严重,可能加剧当前面临的多重危机,如气候变化、资源枯竭…