You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL如何实现持锁会话可读写其余会话仅可读的表锁需求

可行方案:使用MySQL的READ LOCAL表级锁

这是MySQL专门针对这类场景设计的锁类型,完全匹配你的需求,特性如下:

  • 持锁会话:可正常对加锁表执行读写操作,不会出现普通READ锁限制持锁者写入的问题
  • 其他会话:可正常执行读操作,不会像普通WRITE锁那样阻塞所有读请求;所有写操作不会直接抛出报错,会进入阻塞队列等待锁释放,锁释放后会自动按顺序执行,不会丢失请求

使用方法

  1. 持锁会话执行加锁命令:
LOCK TABLES 你的目标表名 READ LOCAL;
  1. 业务操作完成后执行锁释放命令即可恢复所有会话的正常读写权限:
UNLOCK TABLES;

如果持锁会话意外断开,MySQL会自动释放该会话持有的所有表锁,不会出现死锁残留问题。

验证方式(可自行测试确认)

你可以开两个独立的MySQL会话做简单验证:

  • 会话1加READ LOCAL锁后执行写入操作,确认可正常执行
  • 会话2执行读操作,确认可正常返回结果
  • 会话2执行写入操作,确认不会报错、只会进入等待状态
  • 会话1释放锁后,确认会话2的写入操作自动执行成功

注意:如果使用MyISAM引擎,READ LOCAL默认允许其他会话执行并发插入(即向表末尾追加数据的INSERT操作不会被阻塞),如果需要完全阻塞所有其他会话的写操作,可以将系统变量concurrent_insert临时设置为0,锁释放后再恢复原值即可。

内容的提问来源于stack exchange,提问作者David Marcus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 17:57:02