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 提供了更灵活的锁控制能力,推荐在新项目中使用。