mysql 默认使用的是行锁还是表锁,取决于你使用的存储引擎。
在现代 mysql 开发中,默认的存储引擎是 innodb,因此通常情况下,mysql 默认使用的是行锁(row lock)。
为了让你更清晰地理解,我们需要区分两种主要引擎的默认行为:
1. 核心结论:看引擎
| 存储引擎 | 默认锁粒度 | 特点 | 适用场景 |
|---|---|---|---|
| innodb (默认) | 行锁 (row lock) | 并发性能高,支持事务。 | 绝大多数业务场景(高并发、写操作多)。 |
| myisam (老旧) | 表锁 (table lock) | 并发性能低,不支持事务。 | 仅读或读多写少的历史遗留系统。 |
2. 深度解析:innodb 的“行锁陷阱”
虽然 innodb 默认是行锁,但这并不代表它永远只锁行。这是很多开发者容易踩的坑。innodb 的行锁是通过索引来实现的。
正常情况(走索引):
如果你的 sql 语句(如update或delete)在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 引擎,在以下情况也会使用表锁:
- ddl 操作:执行
alter table修改表结构时,通常会锁住整张表(虽然新版本支持在线 ddl,但在特定阶段仍会加锁)。 - 显式加锁:手动执行
lock tables table_name write;命令。 - 全表更新:执行不带
where条件的update或delete语句。
总结建议
为了保证 mysql 发挥最佳的并发性能(即使用行锁),请务必遵循以下原则:
使用 innodb 引擎(这是默认选项,不要改)。
到此这篇关于mysql的innodb使用行锁的限制的文章就介绍到这了,更多相关mysql innodb行锁限制内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论