MySQL锁表用于保证数据一致性,常用LOCK TABLES语句实现读锁(READ)和写锁(WRITE),需手动UNLOCK TABLES释放,InnoDB更推荐事务与行级锁。

MySQL中锁表主要是为了在执行某些操作时防止其他会话对表进行修改,保证数据一致性。最常用的是 LOCK TABLES 语句,但要注意它只在当前会话有效,且使用后必须显式释放。
锁表的基本语法与类型
MySQL支持多种锁表方式,常用的是读锁(READ)和写锁(WRITE):
- READ LOCK:允许其他会话读取该表,但禁止写入(INSERT/UPDATE/DELETE/ALTER等);当前会话只能读,不能写。
- WRITE LOCK:当前会话独占该表,其他会话既不能读也不能写,直到锁被释放。
示例:
LOCK TABLES users READ;LOCK TABLES orders WRITE;
锁多张表与混合锁类型
可以一次锁定多张表,并为不同表指定不同锁类型,用逗号分隔:
LOCK TABLES users READ, logs WRITE, config READ;注意:如果某张表已加了READ锁,后续不能再对其加WRITE锁(会报错),反之亦然;所有被锁的表必须在同一个数据库中(跨库锁表需指定 db_name.table_name)。
解锁与自动释放规则
锁表后必须手动解锁,使用:
UNLOCK TABLES;以下操作也会自动释放当前会话的所有表锁:
- 执行新的 LOCK TABLES 语句(会先释放旧锁再加新锁)
- 会话断开连接(如客户端异常退出或超时)
- 执行 START TRANSACTION 或 BEGIN(InnoDB引擎下会隐式释放 LOCK TABLES 锁)
注意事项与常见误区
LOCK TABLES 是 MyISAM 和 MEMORY 引擎更常用的机制,InnoDB 更推荐使用事务和行级锁。使用时需特别注意:
- 锁表期间不能访问未被显式锁定的表(除非是临时表或 INFORMATION_SCHEMA 表)
- 执行 SELECT 前必须确保该表已被锁定,否则会报错 “Table 'xxx' was not locked with LOCK TABLES”
- 存储过程或函数内慎用,容易引发死锁或权限问题
- 高并发场景下尽量避免长时间持有 WRITE LOCK,会影响整体性能










