当前位置: 代码网 > it编程>数据库>Mysql > mysql的InnoDB使用行锁的限制

mysql的InnoDB使用行锁的限制

2026年03月13日 Mysql 我要评论
mysql 默认使用的是行锁还是表锁,取决于你使用的存储引擎。在现代 mysql 开发中,默认的存储引擎是 innodb,因此通常情况下,mysql 默认使用的是行锁(row lock)。为了让你更清

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行锁限制内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com