MySQL 锁详解:从原理到实战的并发控制指南

前言

在高并发场景下,锁是 MySQL 保证数据一致性的核心机制。正确理解锁的类型、行为及适用场景,能有效避免数据竞争、死锁等问题,是构建可靠数据库应用的关键。本文从锁的分类、存储引擎差异到实战优化,结合代码示例,系统解析 MySQL 锁机制的核心原理与最佳实践。


一、锁分类:按粒度与功能划分

1. 按锁粒度划分

(1)全局锁(Global Lock)
  • 作用范围:锁定整个数据库实例
  • 典型场景:全库逻辑备份(FLUSH TABLES WITH READ LOCK)
  • 代码示例
    -- 加全局读锁(阻塞写操作)
    FLUSH TABLES WITH READ LOCK;  
    -- 释放锁
    UNLOCK TABLES;  
    
  • 风险:长时间锁定会导致业务阻塞,仅推荐用于冷备场景
(2)表锁(Table Lock)
  • MyISAM 存储引擎默认锁:
    • 读锁(共享锁):允许多个会话读取,阻塞写操作
    • 写锁(排他锁):独占表,阻塞读写操作
  • InnoDB 表锁:仅在无索引条件时退化为表锁(如UPDATE table SET col=1 WHERE non_index_col=1
  • 锁状态查看
    SHOW STATUS LIKE 'Table%Lock%';  
    
(3)行锁(Row Lock)
  • InnoDB 默认锁:基于索引锁定数据行
  • 分类
    • 共享锁(S 锁):允许读取,多个会话可共存(SELECT … LOCK IN SHARE MODE)
    • 排他锁(X 锁):独占行,阻塞其他锁(SELECT … FOR UPDATE)
  • 代码示例:
    // Java中使用排他锁
    try (Connection conn = dataSource.getConnection();
         PreparedStatement stmt = conn.prepareStatement(
             "SELECT * FROM orders WHERE id = 1001 FOR UPDATE")) {
         
         
        ResultSet rs = stmt.executeQuery();
        // 处理数据(期间其他会话无法修改该行)
    }
    

2. 按兼容性划分

锁类型 共享锁(S) 排他锁(X)
共享锁(S) 兼容 不兼容
排他锁(X) 不兼容 不兼容

二、InnoDB 锁机制深度解析

1. 行锁实现条件

  • 必须命中索引:
    -- 命中索引,加行锁  
    UPDATE orders SET stat

你可能感兴趣的:(mysql,mysql,数据库,后端,java,sql)