讲师中心 微信公众号
AI工具推荐 视频效率加速

怎样在MySQL存储过程中实现分布式锁以防并发冲突

星辰大大_6251

星辰大大_6251

发布时间:2026-09-20 12:57:09

|

191人浏览过

|

来源于php中文网

原创

MySQL存储过程不能直接用INSERT…ON DUPLICATE KEY UPDATE模拟锁,因其无法捕获1062异常实现可控重试,且事务边界易混淆;正确做法是应用层负责加锁(如SELECT…FOR UPDATE),存储过程仅执行业务逻辑。

怎样在mysql存储过程中实现分布式锁以防并发冲突

存储过程里不能直接用 INSERT ... ON DUPLICATE KEY UPDATE 模拟锁

很多人第一反应是:在存储过程中写个 INSERT INTO distributed_lock,失败就重试。但问题在于——MySQL 存储过程本身不捕获唯一键冲突异常(如 1062 Duplicate entry)为可控流程,DECLARE HANDLER 虽能捕获,但无法在事务外做“重试等待”,且存储过程调用栈中难以实现阻塞语义。更关键的是,业务逻辑若也写在同一个存储过程中,锁的生命周期和事务边界容易混淆,导致锁未释放或提前释放。

必须用表结构 + 外部控制逻辑配合存储过程

真正可行的做法,是把锁操作“拆出来”:由应用层(如 Java/Python)负责获取/释放锁,存储过程只做纯业务逻辑,并假设调用者已持有有效锁。这时存储过程只需专注安全执行,例如:

  • 所有涉及共享资源的 DML 操作(如更新库存、生成订单号)都放在一个存储过程中
  • 该存储过程开头加 SELECT ... FOR UPDATE 对锁表某行加行锁(需提前插入占位记录)
  • lock_key 作为主键或唯一索引字段,确保 SELECT lock_key FROM distributed_lock WHERE lock_key = 'xxx' FOR UPDATE 能命中单行并阻塞其他并发请求
  • 业务执行完后,由外部程序执行 DELETE 或更新 expire_time,而非在存储过程中删——否则事务回滚会导致锁残留

SELECT ... FOR UPDATE 在锁表上才真正起作用

注意:只有当 distributed_lock 表有合适索引(如 PRIMARY KEY(lock_key)UNIQUE KEY(lock_key)),SELECT ... WHERE lock_key = ? FOR UPDATE 才会锁定对应行,而不是锁全表。如果只建了普通索引或没索引,MySQL 可能升级为表锁,吞吐暴跌。

MySQL
MySQL

编写正确的MySQL查询,避免字符集、索引和锁方面的常见陷阱。

下载

常见错误包括:

  • 建表时只加了 UNIQUE KEY 但没设 PRIMARY KEY,导致 InnoDB 用隐式聚簇索引,FOR UPDATE 行为不可控
  • 查询条件用了函数(如 WHERE UPPER(lock_key) = 'XXX'),使索引失效,触发全表扫描+锁表
  • 事务未显式 COMMITROLLBACK,导致行锁长期持有,阻塞后续所有请求

过期清理不能依赖存储过程定时触发

有人想写个存储过程每天跑一次 DELETE FROM distributed_lock WHERE expire_time ,但这解决不了实时性问题:服务崩溃后,锁可能卡住几十秒甚至几分钟,而定时任务间隔通常是小时级。正确做法是:

  • 应用层获取锁时,始终设置 expire_time = NOW() + INTERVAL N SECOND(N 至少为业务最大耗时的 2 倍)
  • 另起一个轻量后台任务(如 Spring Scheduler / cron job),每 10–30 秒扫描 expire_time 索引字段,清理过期记录
  • 绝不让存储过程承担“看门狗”职责——它没有心跳机制,也无法感知客户端是否还存活

最易被忽略的一点:expire_time 字段必须配 INDEX,否则清理 SQL 会全表扫描,高并发下直接拖垮数据库。

热门AI工具

更多
AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

1893

2023.06.20

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

1159

2023.06.21

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

675

2023.07.18

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2432

2023.07.19

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

3948

2023.07.25

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

959

2023.08.08

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

4231

2023.08.11

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

3862

2023.08.14

AI视频生成软件推荐
AI视频生成软件推荐

本专题汇总了当前主流的AI视频生成软件推荐与排行榜单,涵盖seko、AniShort、剧云、Lovart、LiblibAI及立刻mv等热门工具。同时整理了各软件在文生视频、图生视频、时长限制、画质表现及免费额度等方面的差异对比,助您快速选对适合创作需求的AI视频生成工具。

160

2026.09.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 168人学习

使用phpenv集成环境安装极致CMS
使用phpenv集成环境安装极致CMS

共2课时 | 267人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn