什么是行锁和表锁_mysql锁区别说明

9次阅读

行锁和表锁的核心区别在于锁定范围:行锁只锁满足条件的行,表锁锁整张表;行锁由 InnoDB 实现、依赖索引、并发高但可能死锁,表锁开销小、无死锁但并发低;选型应依引擎与场景,InnoDB+ 行锁适用于高频更新业务,表锁适合批量操作或 MyISAM 只读系统。

什么是行锁和表锁_mysql 锁区别说明

行锁和表锁是 MySQL 中两种基础的并发控制机制,核心 区别 在于锁定范围不同:行锁只锁住满足条件的某几行数据,表锁则直接锁住整张表。

行锁:细粒度、高并发、依赖索引

行锁由 InnoDB 存储引擎实现,是 MySQL 最小粒度的锁。它只对 SQL 实际访问到的数据行加锁,其他事务仍可操作表中未被锁定的行。

  • 自动触发:执行 UPDATE、DELETE、INSERT 时,InnoDB 默认对涉及的行加排他锁(X 锁);普通 SELECT 不加锁
  • 显式使用:SELECT … FOR UPDATE 加排他锁,SELECT … LOCK IN SHARE MODE 加共享锁(S 锁)
  • 关键前提:必须走索引(主键或二级索引),否则会退化为表锁——比如 WHERE name = 'xxx'name 无索引,就会锁全表
  • 优点:并发高、冲突少;缺点:开销大、可能死锁、需合理设计索引

表锁:粗粒度、简单快、适合批量操作

表锁作用于整张表,MyISAM 引擎默认使用表锁,InnoDB 在特定场景下也会用(如显式 LOCK TABLES 或 DDL 操作)。

  • 自动加锁:MyISAM 执行 SELECT 自动加读锁(共享锁),执行 UPDATE/INSERT/DELETE 自动加写锁(独占锁)
  • 显式加锁:LOCK TABLES t1 READ(允许多个读)、LOCK TABLES t1 WRITE(仅当前会话可读写)
  • 读锁不阻塞读,但阻塞写;写锁阻塞所有读写;MyISAM 写操作是串行的
  • 优点:开销小、不会死锁;缺点:并发低、容易成为 性能瓶颈

怎么选?看业务场景和引擎

绝大多数在线业务应优先用 InnoDB + 行锁,尤其订单、库存、账户等高频更新场景。表锁更适合临时批量导入、统计报表生成、或 MyISAM 只读查询为主的系统。

注意:InnoDB 的行锁能力不是“自动生效”的——没有索引的 WHERE 条件、全表扫描、或使用 LIKE '%abc' 等无法命中索引的情况,都会导致锁升级为表锁。

星耀云
版权声明:本站原创文章,由 星耀云 2025-12-27发表,共计903字。
转载说明:转载本网站任何内容,请按照转载方式正确书写本站原文地址。本站提供的一切软件、教程和内容信息仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。
text=ZqhQzanResources