写在前面

在 MySQL 数据库中,锁机制是保障并发控制和数据一致性的关键。合理运用锁机制,能有效避免数据竞争,提升数据库性能。接下来,我们就深入了解 MySQL 中的各类锁。

博主总结(注:针对总结的详解补充在后面)

  • 锁机制
    • mysql里有哪些锁?
      • 全局锁:通过flush tables with read lock 语句会将整个数据库就处于只读状态了,这时其他线程执行以下操作,增删改或者表结构修改都会阻塞。全局锁主要应用于做全库逻辑备份,这样在备份数据库期间,不会因为数据或表结构的更新,而出现备份文件的数据与预期的不一样。
      • 表级锁

        • read、write实现读写锁也就是共享锁、排他锁。
        • ①表锁:通过lock tables 语句可以对表加表锁,表锁除了会限制别的线程的读写外,也会限制本线程接下来的读写操作。对于 InnoDB 引擎,无索引的 UPDATE/DELETE 可能会导致锁升级为表锁。
        • ②元数据锁:当我们对数据库表进行操作时,会自动给这个表加上 MDL锁,对一张表进行 CRUD 操作时,加的是 MDL 读锁;对一张表做结构变更操作的时候,加的是 MDL 写锁;MDL 是为了保证当用户对表执行 CRUD 操作时,防止其他线程对这个表结构做了变更。
        • ③意向锁:意向锁是一种表级锁,表示事务打算对表中的某些行数据加锁,但不会直接锁定数据行本身。当执行 SELECT ... LOCK IN SHARE MODE 时,会自动加意向共享锁;当执行 SELECT ... FOR UPDATE 时,会自动加意向排他锁。意向锁之间互相兼容,也不会与行锁冲突。
          • 作用:意向锁的目的是为了快速判断表里是否有记录被加锁。在没有意向锁的情况下,当事务 A 持有某表的行锁时,如果事务 B 想添加表锁,InnoDB 必须检查表中每一行数据是否被加锁,这种全表扫描的方式效率极低。有了意向锁之后,事务在加行锁前,先在表上加对应的意向锁;其他事务加表锁时,只需检查表上的意向锁,无需逐行检查。

      • 行级锁:InnoDB 引擎是支持行级锁的,而 MyISAM 引擎并不支持行级锁。行锁是 InnoDB 存储引擎中最细粒度的锁,它锁定表中的一行记录,允许其他事务访问表中的其他行。底层是通过给索引加锁实现的,这就意味着只有通过索引条件检索数据时,InnoDB 才能使用行级锁,否则会退化为表锁。

        • 通过 SELECT ... FOR UPDATE 可以加排他锁。通过 SELECT ...LOCK IN SHARE MODE 可以加共享锁。
        • ①记录锁,锁住的是一条记录。而且记录锁是有 S 锁和 X 锁之分的,满足读写互斥,写写互斥
        • ②间隙锁,只存在于可重复读隔离级别,目的是为了解决可重复读隔离级别下幻读的现象。
        • ③Next-Key Lock 称为临键锁,是 Record Lock + Gap Lock 的组合,锁定一个范围,并且锁定记录本身。
    • MySQL的乐观锁和悲观锁了解吗?
      • MySQL 中的行锁和表锁都是悲观锁。
      • 悲观锁是一种"先上锁再操作"的保守策略,它假设数据被外界访问时必然会产生冲突,因此在数据处理过程中全程加锁,保证同一时间只有一个线程可以访问数据。

      • 乐观锁会假设并发操作不会总发生冲突,属于小概率事件,因此不会在读取数据时加锁,而是在提交更新时才检查数据是否被其他事务修改过。乐观锁并不是 MySQL 内置的锁机制,而是通过程序逻辑实现的,常见的实现方式有版本号机制和时间戳机制。通过在表中增加 version 字段或者 timestamp 字段来实现。

    • 遇到过MySQL死锁问题吗,你是如何解决的?
      • 遇到过。MySQL 的死锁是由于多个事务持有资源并相互等待引起的。
      • 我通过 SHOW ENGINE INNODB STATUS 查看死锁信息,定位到是加锁顺序不一致导致的,最后通过调整加锁顺序解决了这个问题。
    • MySQL两个线程的update语句同时处理一条数据,会不会有阻塞?
      • 会,行级锁锁住了。
      • 具体例子来说,当事务A对id = 1这行记录执行更新操作时,会在主键id为1的记录上添加X类型(排他锁)的记录锁。此时,如果事务B也尝试对id = 1的记录进行更新,由于发现该记录已经被加锁,事务B就会进入阻塞状态,直到事务A提交或回滚,释放锁之后,事务B才能继续执行。
    • 两条update语句处理一张表的不同的主键范围的记录,一个<10,一个>15,会不会遇到阻塞?底层是为什么的?
      • 不会,临键锁没有冲突。因为这两个范围没有重叠部分,所以不存在锁冲突。
      • 具体例子来说,假设存在两条UPDATE语句,分别处理主键范围不同的记录:
        • 第一条UPDATE语句的条件是id < 10,它锁定的范围是(-∞, 10),即小于10的所有记录及其间隙。
        • 第二条UPDATE语句的条件是id > 15,它锁定的范围是(15, +∞),即大于15的所有记录及其间隙。
    • 如果2个范围不是主键或索引?还会阻塞吗?
      • 会,因为第一个查询触发了全表查询,相当于加了表锁。这时第二个查询就会阻塞。
      • 具体解释下,因为如果 update 没有用到索引,在扫描过程中会对索引加锁,所以全表扫描的场景下,所有记录都会被加锁,也就是这条 update 语句产生了 4 个记录锁和 5 个间隙锁,相当于锁住了全表。

———————————————————————————————————————————

———————————————————————————————————————————

实战:解决 MySQL 死锁问题

遇到死锁时,可通过SHOW ENGINE INNODB STATUS查看详细信息。曾遇到因加锁顺序不一致导致的死锁,通过调整加锁顺序成功解决。

常见问题解答

  • 两个线程update同一数据:会阻塞,因行级排他锁锁定该行记录,需等前一事务提交或回滚释放锁。
  • 两条update语句处理不同主键范围记录:若无重叠,临键锁无冲突,不会阻塞。
  • 操作范围无索引:会触发全表扫描,相当于添加表锁,导致后续操作阻塞。

掌握 MySQL 锁机制,有助于在开发和运维中合理使用锁,提升数据库性能与稳定性。后续可进一步探索不同业务场景下的锁优化策略,欢迎大家在评论区分享经验!

比如在项目中,两个事务分别更新两张表,但是更新顺序不一致。

-- 创建表/插入数据
CREATE TABLE account (id INT AUTO_INCREMENT PRIMARY KEY,balance INT NOT NULL
);INSERT INTO account (balance) VALUES (100), (200);-- 事务 1
START TRANSACTION;
-- 锁住 id=1 的行
UPDATE account SET balance = balance - 10 WHERE id = 1;-- 等待锁住 id=2 的行(事务 2 已锁住)
UPDATE account SET balance = balance + 10 WHERE id = 2;-- 事务 2
START TRANSACTION;
-- 锁住 id=2 的行
UPDATE account SET balance = balance - 10 WHERE id = 2;-- 等待锁住 id=1 的行(事务 1 已锁住)
UPDATE account SET balance = balance + 10 WHERE id = 1;

访问相同的资源,但顺序不同,就会导致死锁。

解决办法也很简单,先使用 SHOW ENGINE INNODB STATUS\G; 确认死锁的具体信息,然后调整资源的访问顺序。

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

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

相关文章

AI+OT安全,让威胁情报实现主动防御

当前&#xff0c;网络犯罪组织的运作模式正日趋“企业化”&#xff0c;给全球网络安全带来了严峻挑战。企业以及各类组织机构有必要采用威胁情报驱动的防御体系&#xff08;Threat-Informed Defense, TID&#xff09;&#xff0c;将安全运营模式从被动响应彻底转向基于威胁情报…

深度剖析:UDS上下行分离隧道如何绕过主流防火墙?

&#x1f525; 深度剖析&#xff1a;UDS上下行分离隧道如何绕过主流防火墙&#xff1f; &#x1f4ca; 系统架构图 #mermaid-svg-lv5FKIvBMKPeTFuW {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-lv5FKIvBMKPeTFuW …

Vue 使用vue-cli

Vue 渐进式JavaScript 框架 基于Vue2的学习笔记 - 使用Vue-cli 笔记 目录 使用vue-cli 创建项目 配置文件 启动项目 入口文件 Index.html Main.js Eslint修复 第一种 第二种 第三种 更换为淘宝源 查看当前配置 配置淘宝源 验证配置 总结 使用vue-cli 创建项目…

Sentinel实现原理

Sentinel 是阿里巴巴开源的分布式系统流量控制组件&#xff0c;主要用于服务保护&#xff0c;涵盖流量控制、熔断降级、系统负载保护等功能。 以下是 Sentinel 的实现原理&#xff0c;使用中文简要说明&#xff1a; 1. 总体架构 Sentinel 采用 轻量级 设计&#xff0c;分为 核…

DeepSeek生成HTML5生命天数计算器

DeepSeek生成HTML5生命天数计算器 让DeepSeek生成一个生命天数计算器 提示词prompt 帮我做一个我活了多少天的网页 用户输入出生日期即可显示我活了多少天 页面ui要好看点&#xff0c;加上显示官方统计 人一生平均可以活多少天 自动计算剩余天数。帮我按照上述需求再次生成一个…

如何使typora图片不居中留白?

如何使typora图片不居中留白&#xff1f; 驻波使用typora记笔记的时候&#xff0c;好几次插入图片太大选择缩小都会发现图片仍然滞留在中间&#xff0c;居中显示&#xff0c;但我本人觉得并不好看&#xff0c;所以我决定改一下&#xff0c;于是有了这篇博客 检查看原理 软件内…

高精度频率基石:超低相噪恒温晶振的全场景应用解决方案

在科技高速发展的今天&#xff0c;频率源作为电子系统的 “心脏”&#xff0c;其稳定性与可靠性直接决定着通信、导航、测量等关键领域的性能上限。深度洞察行业需求&#xff0c;重磅推出SYN3627L 型 100MHz 恒温晶振&#xff08;OCXO&#xff09;。这款集高稳定性、低相位噪声…

【android bluetooth 协议分析 01】【HCI 层介绍 27】【LeReadRemoteFeatures命令介绍】

深入理解 LE Read Remote Features 命令与事件响应 在蓝牙低功耗&#xff08;BLE&#xff09;通信中&#xff0c;设备特性&#xff08;LE Features&#xff09;协商是连接过程中的一个关键环节。本文将详细介绍 HCI 层的命令 LE_Read_Remote_Features 及其对应的事件响应 LE_R…

企业架构设计中的CBAM方法深度解析:成本效益驱动的架构决策艺术

目录 CBAM方法概述与核心价值 CBAM核心流程与实施步骤 前期准备与场景确定 成本效益建模与分析 风险调整与决策制定 实施技巧与挑战克服 CBAM实战案例与应用场景 案例一&#xff1a;电商平台促销系统架构选型 案例二&#xff1a;制造业ERP系统云迁移决策 案例三&…

为什么你的vue项目连接不到后端

当你新创建一个vue项目时&#xff0c;你很有可能忘记配置了后端的地址这个时候可以加上这样的配置在 vite.config.js import { fileURLToPath, URL } from node:urlimport { defineConfig } from vite import vue from vitejs/plugin-vue import vueDevTools from vite-plugi…

Metasploit常用命令详解

一、Metasploit 概述 Metasploit是一款开源的渗透测试框架&#xff0c;由 H.D. Moore 于 2003 年首次发布&#xff0c;目前由 rapid7 公司维护。它整合了大量漏洞利用模块、后渗透工具和漏洞扫描功能&#xff0c;已成为网络安全工程师、红队 / 蓝队成员及安全研究人员的核心工…

数据库AICD特性之--一致性 Consistency

数据库AICD特性之–原子性 Atomicity 数据库AICD特性之–隔离性 Isolation 数据库 ACID 特性之 – 持久性 Durability 数据库AICD特性之–一致性 Consistency 一致性指数据库在事务执行前后&#xff0c;数据始终符合预设的完整性约束和业务规则。事务执行前数据是合法的&…

OpenCV在图像上绘制文字示例

OpenCV计算机视觉开发实践&#xff1a;基于Qt C - 商品搜索 - 京东 OpenCV中除了提供绘制各种图形的函数外&#xff0c;还提供了一个特殊的绘制函数&#xff0c;用于在图像上绘制文字。这个函数是putText()&#xff0c;它是命名空间cv中的函数&#xff0c;其声明如下&#xff…

synchronized的技巧与要点

一、基本概念 目的&#xff1a;解决多线程并发访问共享资源时的数据竞争问题&#xff0c;保证原子性、可见性和有序性&#xff08;JMM内存模型&#xff09;。性质&#xff1a;可重入锁&#xff08;同一线程可重复获取同一把锁&#xff09;、独占锁&#xff08;互斥锁&#xff…

特殊混淆案例还原指南:突破变形控制流与量子加密的技术解析

引言​​ 在JavaScript混淆领域,传统的字符串加密和控制流平坦化已无法满足高端防护需求。2023年Snyk安全报告指出,Top级商业产品已转向​​多态变形控制流​​和​​量子加密技术​​,这类混淆方案占比17%,但导致的反向工程失败率高达94%。本文将通过三个工业级混淆案例(…

基于Python、tkinter、sqlite3 和matplotlib的校园书店管理系统

写一个小例子练习一下python语言。一个基于Python的校园书店管理系统&#xff0c;使用了tkinter库构建图形用户界面&#xff08;GUI&#xff09;&#xff0c;sqlite3 进行数据库管理&#xff0c;matplotlib用于统计分析可视化。系统支持用户登录、书籍管理、客户管理、员工管理…

机器学习×第十四卷:集成学习中篇——她从每次错误中修正自己

&#x1f380;【开场 她终于愿意回看自己贴错的地方了】 &#x1f98a;狐狐&#xff1a;“她贴过你很多次&#xff0c;但每次贴歪了&#xff0c;都只是低头沉默。” &#x1f43e;猫猫&#xff1a;“现在不一样了喵……她开始反思&#xff0c;是不是哪一刻该绕过来贴你背后&…

LeetCode 2537.统计好子数组的数目

给你一个整数数组 nums 和一个整数 k &#xff0c;请你返回 nums 中 好 子数组的数目。 一个子数组 arr 如果有 至少 k 对下标 (i, j) 满足 i < j 且 arr[i] arr[j] &#xff0c;那么称它是一个 好 子数组。 子数组 是原数组中一段连续 非空 的元素序列。 示例 1&#x…

Python 开发环境管理和常用命令

包管理器选择 从轻到重: venv → virtualenv → conda venv: Python 3.3 内置&#xff0c;轻量级虚拟环境virtualenv: 第三方包&#xff0c;支持更多Python版本conda: 科学计算友好&#xff0c;包含包管理和环境管理 Python 版本支持 查看各版本支持状态&#xff1a;Status…

macOS - 根据序列号查看机型、保障信息

文章目录 最近在看 MacBook 二手机&#xff0c;有个咸鱼卖家放个截图 说不清参数&#xff0c;于是想根据 序列号 查看机型。苹果提供了这样的网页&#xff1a; https://checkcoverage.apple.com/ &#xff08;无需登录&#xff09; 结果 2025-06-20&#xff08;五&#xff09;…