mysql的InnoDB使用行锁的限制

 更新时间:2026年03月13日 09:28:49   作者:leese233  
本文主要介绍了mysql的InnoDB使用行锁的限制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

MySQL 默认使用的是行锁还是表锁,取决于你使用的存储引擎

在现代 MySQL 开发中,默认的存储引擎是 InnoDB,因此通常情况下,MySQL 默认使用的是行锁(Row Lock)

为了让你更清晰地理解,我们需要区分两种主要引擎的默认行为:

1. 核心结论:看引擎

存储引擎默认锁粒度特点适用场景
InnoDB (默认)行锁 (Row Lock)并发性能高,支持事务。绝大多数业务场景(高并发、写操作多)。
MyISAM (老旧)表锁 (Table Lock)并发性能低,不支持事务。仅读或读多写少的历史遗留系统。

2. 深度解析:InnoDB 的“行锁陷阱”

虽然 InnoDB 默认是行锁,但这并不代表它永远只锁行。这是很多开发者容易踩的坑。InnoDB 的行锁是通过索引来实现的

  • 正常情况(走索引)
    如果你的 SQL 语句(如 UPDATEDELETE)在 WHERE 条件中用到了索引,InnoDB 会精准锁定符合条件的那一行(或几行)。

    例子:UPDATE user SET name='A' WHERE id = 1; (假设 id 是主键)
    结果:只锁住 id=1 这一行,其他行不受影响。

  • 异常情况(不走索引)
    如果你的 SQL 语句在 WHERE 条件中没有用到索引,InnoDB 无法定位到具体的行,它会进行全表扫描。为了确保数据一致性,它会将扫描过的所有行都锁住。这在效果上等同于表锁

    例子:UPDATE user SET name='A' WHERE status = 1; (假设 status 字段没有索引)
    结果:锁住整张表的所有行,其他事务无法修改表中任何数据,直到事务提交。

3. 特殊情况:什么时候会强制用表锁?

即使是 InnoDB 引擎,在以下情况也会使用表锁:

  1. DDL 操作:执行 ALTER TABLE 修改表结构时,通常会锁住整张表(虽然新版本支持在线 DDL,但在特定阶段仍会加锁)。
  2. 显式加锁:手动执行 LOCK TABLES table_name WRITE; 命令。
  3. 全表更新:执行不带 WHERE 条件的 UPDATEDELETE 语句。

总结建议

为了保证 MySQL 发挥最佳的并发性能(即使用行锁),请务必遵循以下原则:

使用 InnoDB 引擎(这是默认选项,不要改)。

到此这篇关于mysql的InnoDB使用行锁的限制的文章就介绍到这了,更多相关mysql InnoDB行锁限制内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • MySQL不支持InnoDB的解决方法

    MySQL不支持InnoDB的解决方法

    在OpenSUSE下装上MySQL后,发现无法选择添加事务支持数据引擎InnoDB。
    2009-11-11
  • mysql按逗号分割的实现

    mysql按逗号分割的实现

    在MySQL中,我们经常需要对数据进行拆分和处理,其中一个常见需求就是按逗号分割字符串,具有一定的参考价值,感兴趣的可以了解一下
    2023-11-11
  • MySQL Binlog 日志监听与 Spring 集成实战场景

    MySQL Binlog 日志监听与 Spring 集成实战场景

    MySQL 的二进制日志(binlog)有三种常见的格式:Statement 模式、Row 模式和Mixed 模式,这篇文章主要介绍了MySQL Binlog 日志监听与 Spring 集成实战,需要的朋友可以参考下
    2024-12-12
  • Mysql中有关Datetime和Timestamp的使用总结

    Mysql中有关Datetime和Timestamp的使用总结

    mysql数据库常用的时间类型有timestamp和datetime,两者主要区别是占用存储空间长度不一致、可存储的时间也有限制,本文就来详细的介绍一下,感兴趣的可以了解一下
    2021-12-12
  • 关于MySQL日期类型的选择建议

    关于MySQL日期类型的选择建议

    在软件开发中,时间记录是不可或缺的功能,如记录操作时间、交易时间等,通常不建议使用字符串存储日期,因为它占用空间大,并且效率低下,MySQL提供的Datetime和Timestamp是常用的时间存储类型,Datetime没有时区信息,而Timestamp与时区有关
    2024-10-10
  • Mysql中被锁住的表查询以及如何解锁详解

    Mysql中被锁住的表查询以及如何解锁详解

    这篇文章主要介绍了Mysql中被锁住的表查询以及如何解锁的相关资料,这些方法可以帮助你释放锁并恢复表的正常使用,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-03-03
  • MySQL事务(transaction)看这篇就足够了

    MySQL事务(transaction)看这篇就足够了

    M事务的实现是基于数据库的存储引擎,不同的存储引擎对事务的支持程度不一样,下面这篇文章主要给大家介绍了关于MySQL事务(transaction)的相关资料,需要的朋友可以参考下
    2022-11-11
  • MySQL数据库远程访问权限设置方式

    MySQL数据库远程访问权限设置方式

    这篇文章主要介绍了MySQL数据库远程访问权限设置方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • MySQL的Flush-List和脏页的落盘机制

    MySQL的Flush-List和脏页的落盘机制

    这篇文章主要介绍了MySQL的Flush-List和脏页的落盘机制,帮助大家更好的理解和使用MySQL,感兴趣的朋友可以了解下
    2020-11-11
  • MySQL创建数据库的两种方法

    MySQL创建数据库的两种方法

    这篇文章主要为大家详细介绍了MySQL创建数据库的两种方法,感兴趣的小伙伴们可以参考一下
    2016-05-05

最新评论