Mysql--基础知识点--110--select ... lock in share mode VS select ... for share

SELECT ... FOR SHARE 和 SELECT ... LOCK IN SHARE MODE 在功能上是完全等价的 。FOR SHARE 是在 MySQL 8.0 版本中引入的新标准 SQL 语法,旨在作为 LOCK IN SHARE MODE 的替代方案,后者则作为旧语法保留以确保向后兼容。

核心功能都是对读取的行加共享锁(Shared Lock) ,锁在事务提交或回滚时才会释放。加上共享锁后,其他事务可以读取,但无法修改或删除这些行,直到当前事务结束。

📝 主要区别:新语法优势

FOR SHARE 的主要优势在于支持更多选项,提供了更精细的控制能力:

  • 支持 OF 表名 子句 :在多表连接查询时,可以只锁定特定表的行。这对于需要处理多表关联的复杂事务非常有用,避免了对不必要表的锁定,能提升并发性能。
  • 支持 NOWAIT 和 SKIP LOCKED 选项 :用于处理锁等待的问题。
    • NOWAIT :若请求的行已被其他事务锁定,立即报错返回,不再等待。
    • SKIP LOCKED :若请求的行已被其他事务锁定,直接跳过,只返回未被锁定的行。

💎 总结与建议

简单来说,FOR SHARE 是更现代、功能更强的写法。建议在新的开发工作中优先使用它。

语法示例对比:

sql 复制代码
-- 旧语法 (仍可用,但不推荐)
SELECT * FROM table_name WHERE id = 1 LOCK IN SHARE MODE;

-- 新语法 (推荐使用)
SELECT * FROM table_name WHERE id = 1 FOR SHARE;

-- FOR SHARE 的高级用法示例 (连接查询中只锁定特定表,并设置等待策略)
SELECT * FROM parent p JOIN child c ON p.id = c.parent_id
WHERE p.name = 'Jones' FOR SHARE OF p NOWAIT;

总结来说,FOR SHARE 和 LOCK IN SHARE MODE 的核心功能相同,但 FOR SHARE 提供了更灵活的锁控制能力,推荐在新项目中使用。

相关推荐
IvorySQL3 小时前
PostgreSQL 日报|修复截断 zstd 备份检测(10 月 9 日)
数据库·postgresql
刘胡子大叔3 小时前
SQL 脚本的导入顺序
数据库·sql
代码什么用4 小时前
Spring对IoC的实现
数据库·spring
hz567896 小时前
涉密视频会议设备配置指南:终端、音视频采集与配套设施选型
服务器·网络·数据库·安全·实时音视频·信息与通信·智能硬件
广州浮点FLOATLIC6 小时前
许可证服务器迁移后软件打不开:研发 IT 怎样定位连接问题
linux·服务器·数据库
程序员Sunday6 小时前
MySQL 为什么使用 B+ 树索引?把范围查询、回表和覆盖索引连起来
数据库·mysql
半杯咖啡半行码6 小时前
Qt开发实战:数据库、MV 模式、QProcess与串口通信全攻略
数据库·qt
Yyyyyy~6 小时前
[ Mysql ] 库的操作
mysql
小米里的大麦7 小时前
16 MySQL 事务
数据库·mysql
西柚小萌新7 小时前
【LLM&&AI应用开发 八股文】--4.3.Agent智能体(下)
java·开发语言·数据库