MySQL如何实现持锁会话可读写其余会话仅可读的表锁需求
可行方案:使用MySQL的READ LOCAL表级锁
这是MySQL专门针对这类场景设计的锁类型,完全匹配你的需求,特性如下:
- 持锁会话:可正常对加锁表执行读写操作,不会出现普通READ锁限制持锁者写入的问题
- 其他会话:可正常执行读操作,不会像普通WRITE锁那样阻塞所有读请求;所有写操作不会直接抛出报错,会进入阻塞队列等待锁释放,锁释放后会自动按顺序执行,不会丢失请求
使用方法
- 持锁会话执行加锁命令:
LOCK TABLES 你的目标表名 READ LOCAL;
- 业务操作完成后执行锁释放命令即可恢复所有会话的正常读写权限:
UNLOCK TABLES;
如果持锁会话意外断开,MySQL会自动释放该会话持有的所有表锁,不会出现死锁残留问题。
验证方式(可自行测试确认)
你可以开两个独立的MySQL会话做简单验证:
- 会话1加
READ LOCAL锁后执行写入操作,确认可正常执行 - 会话2执行读操作,确认可正常返回结果
- 会话2执行写入操作,确认不会报错、只会进入等待状态
- 会话1释放锁后,确认会话2的写入操作自动执行成功
注意:如果使用MyISAM引擎,
READ LOCAL默认允许其他会话执行并发插入(即向表末尾追加数据的INSERT操作不会被阻塞),如果需要完全阻塞所有其他会话的写操作,可以将系统变量concurrent_insert临时设置为0,锁释放后再恢复原值即可。
内容的提问来源于stack exchange,提问作者David Marcus
相关产品推荐
相关产品推荐

