当前位置: 首页 > news >正文

【Java高阶面经:数据库篇】12. MySQL锁机制全解:从行锁到死锁优化的深度指南

在这里插入图片描述

一、MySQL锁机制核心原理

1.1 锁的分类与底层逻辑

1.1.1 按粒度分类
锁类型作用范围实现方式典型场景
行锁单行/多行记录依赖索引(如SELECT ... FOR UPDATE高并发更新场景
表锁整张表无索引或显式锁命令(如LOCK TABLESDDL操作、全表扫描
页锁数据页(16KB)介于行锁与表锁之间(BDB引擎)较少使用(InnoDB默认行锁)
1.1.2 按兼容性分类
  • 共享锁(S锁):允许并发读,互斥写(如SELECT ... LOCK IN SHARE MODE)。
  • 排它锁(X锁):独占写,互斥读写(如SELECT ... FOR UPDATE)。
  • 意向锁(IS/IX锁):表级锁标志,预示行锁意图(如事务申请行锁前自动加IS锁)。

锁兼容性矩阵

操作\锁类型S锁X锁IS锁IX锁
S锁兼容互斥兼容互斥
X锁互斥互斥互斥互斥
IS锁兼容互斥兼容兼容
IX锁互斥互斥兼容兼容

二、行锁变表锁的六大核心场景

2.1 场景一:索引失效导致全表扫描

2.1.1 触发条件
  • WHERE条件未命中索引,InnoDB扫描全表,行锁数量超过阈值时升级为表锁。
  • 典型案例
    -- user_id字段无索引
    UPDATE orders SET status='paid' WHERE user_id=100; 
    -- 执行计划:type=ALL(全表扫描),触发表锁
    
2.1.2 诊断与优化
  • 诊断步骤
    1. EXPLAIN查看执行计划,确认type=ALLkey=NULL
    2. SHOW INDEX FROM orders检查索引是否存在。
  • 优化方案
    -- 添加索引
    ALTER TABLE orders ADD INDEX idx_user_id(user_id);
    -- 避免隐式类型转换(如user_id为INT,传入字符串)
    UPDATE orders SET status='paid' WHERE user_id=100; -- 避免单引号
    

2.2 场景二:显式表锁命令干扰

2.2.1 触发条件
  • 手动执行LOCK TABLES命令,覆盖行锁逻辑,强制使用表锁。
  • 典型案例
    BEGIN;
    LOCK TABLES orders WRITE; -- 显式表锁
    UPDATE orders SET amount=200 WHERE id=5; -- 受表锁限制,无法并发
    UNLOCK TABLES;
    
2.2.2 替代方案
  • 推荐实践
    -- 使用事务+行锁替代显式表锁
    BEGIN;
    SELECT * FROM orders WHERE id=5 FOR UPDATE; -- 行锁
    UPDATE orders SET amount=200;
    COMMIT;
    
  • 禁止操作:避免在InnoDB中使用LOCK TABLES,改用事务控制锁粒度。

2.3 场景三:间隙锁范围扩大

2.3.1 触发条件
  • 隔离级别REPEATABLE READ(默认)下,范围查询触发间隙锁(Gap Lock),锁住索引区间。
  • 典型案例&#x

相关文章:

  • 网络流量分析工具ntopng的安装与基本使用
  • 现代计算机图形学Games101入门笔记(十九)
  • 制造业ERP系统选型与实施避坑探讨
  • OneDrive登录,账号跳转问题
  • leetcode hot100刷题日记——8.合并区间
  • Java泛型详解 —— 出参入参绑定技巧
  • 唯创安全优化纸业车间安全环境:门口盲区预警报警器的应用与成效
  • Mariadb cpu 93% 问题
  • SpringBoot Web 入门
  • 线上问题排查
  • 年度工作计划总结述职报告PPT模版一组分享
  • 第19天-Python自动化生成PPT图文教程(基于python-pptx)
  • 5-码蹄集600题基础python篇
  • 人工智能解析:技术革命下的认知重构
  • C语言—Linux环境下CMake设置库(动态/静态)
  • 前端面经-WebGL/threeJS
  • 【Java高阶面经:微服务篇】9.微服务高可用全攻略:从架构设计到自动容灾
  • Java 实现四种单例(都是线程安全)
  • 工程优化大纲
  • 高并发架构设计之限流
  • 做h5小游戏的网站有哪些/5g网络优化工程师