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

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

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

📝 主要区别:新语法优势

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

  • 支持 OF 表名 子句 :在多表连接查询时,可以只锁定特定表的行。这对于需要处理多表关联的复杂事务非常有用,避免了对不必要表的锁定,能提升并发性能。
  • 支持 NOWAITSKIP 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 SHARELOCK IN SHARE MODE 的核心功能相同,但 FOR SHARE 提供了更灵活的锁控制能力,推荐在新项目中使用。

相关推荐
xfhuangfu9 分钟前
Oracle 12.2 ORA-600 数据库发生重启案例
数据库·oracle
m0_6091604915 分钟前
Golang怎么实现数据库连接重试_Golang如何在启动时重试连接直到数据库就绪【技巧】
jvm·数据库·python
罗超驿15 分钟前
8.数据库约束学习笔记:从非空、默认、唯一与主键约束到主键自增
数据库·mysql
zxrhhm1 小时前
PostgreSQL 大规模随机数据生成完整指南
大数据·数据库·postgresql
techdashen1 小时前
Cloudflare + PlanetScale:在边缘运行全栈应用,数据库也不例外
数据库
m0_624578591 小时前
如何在phpMyAdmin中导入GZIP压缩格式文件_加速传输并突破文件大小限制
jvm·数据库·python
m0_495496411 小时前
mysql数据库表名区分大小写吗_通过lower case table names配置
jvm·数据库·python
瀚高PG实验室1 小时前
PG的JDBC对SQL中绑定变量个数的限制
数据库·sql·postgresql·瀚高数据库
lifewange1 小时前
NoSQL
数据库·nosql