MySQL中的锁类型都有哪些

 更新时间:2025年05月09日 10:11:49   作者:篱笆院的狗  
这篇文章主要介绍了MySQL中的锁类型都有哪些,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

MySQL 中的锁机制是保障事务隔离性和并发控制的核心组件,主要分为以下类型,按作用范围和场景分类如下:

一、按锁粒度分类

1. 表级锁(Table-Level Locking)

特性:锁定整张表,开销小但并发性低。

常见类型

  • 表共享锁(LOCK TABLES … READ):允许其他事务读表,但禁止写操作。
  • 表排他锁(LOCK TABLES … WRITE):禁止其他事务读写表。

意向锁(Intention Locks)

  • 意向共享锁(IS):事务打算在行上加共享锁。
  • 意向排他锁(IX):事务打算在行上加排他锁。
  • 作用:作为表级锁,与行级锁兼容性判断的标识,优化锁冲突检测。

2. 行级锁(Row-Level Locking)

特性:仅锁定数据行,开销大但并发性高(InnoDB 默认支持)。

常见类型

  • 记录锁(Record Locks):锁定索引中的单条记录。
  • 间隙锁(Gap Locks):锁定索引记录之间的“间隙”,防止插入新数据(解决幻读)。
  • 临键锁(Next-Key Locks):记录锁 + 间隙锁的组合,锁定记录本身及前一个间隙(InnoDB 默认锁模式)。

二、按锁模式分类

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

  • 特性:允许其他事务读取数据,但禁止修改。
  • 使用场景SELECT ... LOCK IN SHARE MODE

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

  • 特性:禁止其他事务读写数据。
  • 使用场景SELECT ... FOR UPDATE 或自动由 INSERT/UPDATE/DELETE 触发。

三、特殊场景锁

1. 自增锁(AUTO-INC Locks)

  • 特性:针对 AUTO_INCREMENT 列,确保自增值唯一且连续。
  • 行为:在插入语句执行时短暂持有,可能成为并发瓶颈。

2. 插入意向锁(Insert Intention Locks)

  • 特性:当事务尝试插入数据到已锁定的间隙时,设置插入意向锁,表示等待间隙释放。
  • 作用:避免插入冲突,提高并发插入效率。

3. 元数据锁(Metadata Locks,MDL)

特性:隐式加锁,管理对表结构的并发访问(如 DDL 操作)。

行为

  • 修改表结构时(ALTER TABLE),自动请求元数据排他锁。
  • 其他事务若持有该表的元数据锁,需等待释放。

四、存储引擎差异

  • InnoDB:支持行级锁、间隙锁、临键锁,默认隔离级别为 REPEATABLE READ
  • MyISAM:仅支持表级锁,无行级锁,并发性能较低。

五、锁行为与隔离级别关系

隔离级别锁类型特点
读未提交无间隙锁,仅记录锁允许脏读,锁竞争最少
读已提交记录锁(MVCC)通过快照读避免脏读,但可能幻读
可重复读(默认)临键锁(Next-Key Locks)默认锁模式,防止幻读,但可能增加锁竞争
串行化强制表级锁或间隙锁完全串行执行,性能最低

六、使用建议

  1. 优化索引:合理设计索引可减少锁范围(如唯一索引避免间隙锁)。
  2. 控制事务粒度:避免长时间持有锁,减少锁竞争。
  3. 监控锁状态:通过 SHOW ENGINE INNODB STATUSINFORMATION_SCHEMA.INNODB_LOCKS 分析锁冲突。
  4. 隔离级别选择:根据业务需求权衡一致性与并发性能(如读已提交 + 索引优化)。

通过理解锁类型和行为,可有效优化 MySQL 并发性能,避免死锁和性能瓶颈。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • mysql存储过程之创建(CREATE PROCEDURE)和调用(CALL)及变量创建(DECLARE)和赋值(SET)操作方法

    mysql存储过程之创建(CREATE PROCEDURE)和调用(CALL)及变量创建(DECLARE)和赋值(SET

    这篇文章主要介绍了mysql存储过程之创建(CREATE PROCEDURE)和调用(CALL)及变量创建(DECLARE)和赋值(SET)操作方法,结合实例形式较为详细的分析了mysql存储过程创建、调用及变量创建、赋值具体原理、操作技巧与相关注意事项,需要的朋友可以参考下
    2019-12-12
  • MyBatis与MySQL语法区别解析

    MyBatis与MySQL语法区别解析

    MyBatis是Java持久化框架,专注对象与SQL映射;MySQL是数据库管理系统,负责数据存储与SQL执行,两者协作完成数据操作,MyBatis简化代码,MySQL处理底层数据逻辑,本文介绍MyBatis与MySQL语法区别解析,感兴趣的朋友一起看看吧
    2025-08-08
  • MySQL中的套接字错误解决

    MySQL中的套接字错误解决

    socket文件是一种特殊的文件,可以促进不同进程之间的通信,有时候系统或MySQL配置的更改可能导致MySQL无法读取套接字文件,本文主要介绍了MySQL中的套接字错误解决,感兴趣的可以了解一下
    2024-02-02
  • MYSQL数据库使用UTF-8中文编码乱码的解决办法

    MYSQL数据库使用UTF-8中文编码乱码的解决办法

    这篇文章主要介绍了MYSQL数据库使用UTF-8中文编码乱码的解决办法,需要的朋友可以参考下
    2015-10-10
  • MySql分页时使用limit+order by会出现数据重复问题解决

    MySql分页时使用limit+order by会出现数据重复问题解决

    在MySQL中我们通常会采用limit来进行翻页查询,当limit遇到 order by的时候会出现数据重复问题,本文就来记录一下,感兴趣的可以了解一下
    2021-08-08
  • Windows下mysql 8.0.29 winx64安装配置方法图文教程

    Windows下mysql 8.0.29 winx64安装配置方法图文教程

    这篇文章主要为大家详细介绍了Windows下mysql 8.0.29 winx64安装配置方法图文教程,文中安装步骤介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-07-07
  • 使用sql语句insert之前判断是否已存在记录

    使用sql语句insert之前判断是否已存在记录

    这篇文章主要介绍了使用sql语句insert之前判断是否已存在记录,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • MySQL如何查询客户端连接情况

    MySQL如何查询客户端连接情况

    这篇文章主要介绍了MySQL如何查询客户端连接情况,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • 查看 MySQL 已经运行多长时间的方法

    查看 MySQL 已经运行多长时间的方法

    查看MySQL启动时间以及运行了多长时间的方法有利用show与updtime或在linux中直接使用grep mysql 相关参数来查看,下面我们一起来看看
    2014-01-01
  • MySQL四种备份表的实现方式

    MySQL四种备份表的实现方式

    本文主要介绍了MySQL四种备份表的实现方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-02-02

最新评论