MySQL 的行锁、表锁与间隙锁
【摘要】 锁是保证并发安全的关键,MySQL 的锁机制比很多人想象的要复杂。表锁粒度最大,锁定整张表。MyISAM 只支持表锁,InnoDB 虽然以行锁为主,但在 DDL 或某些场景下也会升级为表锁。表锁实现简单、开销小,但并发性最差。行锁粒度最小,只锁住需要的行。InnoDB 的行锁是通过给索引项加锁实现的,如果 SQL 没有走索引,行锁会退化为表锁,这一点非常关键。行锁并发性好,但加锁开销大,还容...
锁是保证并发安全的关键,MySQL 的锁机制比很多人想象的要复杂。
表锁粒度最大,锁定整张表。MyISAM 只支持表锁,InnoDB 虽然以行锁为主,但在 DDL 或某些场景下也会升级为表锁。表锁实现简单、开销小,但并发性最差。
行锁粒度最小,只锁住需要的行。InnoDB 的行锁是通过给索引项加锁实现的,如果 SQL 没有走索引,行锁会退化为表锁,这一点非常关键。行锁并发性好,但加锁开销大,还容易出现死锁。
间隙锁是 InnoDB 在可重复读隔离级别下特有的。当使用范围条件查询(如 WHERE id > 10)或没有唯一索引时,InnoDB 不仅会给已有记录加锁,还会给记录之间的「间隙」加锁,防止其他事务插入新数据导致幻读。间隙锁也是死锁的常见来源。
实际开发中要注意几点:尽量走索引,避免锁升级;控制事务大小,减少持锁时间;避免死锁,保持加锁顺序一致;能用唯一索引精确匹配时,就不要让间隙锁生效。
一句话:粒度越小并发越好,索引决定了行锁是否生效。
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)