MySQL——数据库并发控制策略: 乐观锁与悲观锁

在多线程或多用户并发访问数据库时,为保证数据的一致性与完整性并发控制机制 尤为重要。其中,乐观锁(Optimistic Lock)悲观锁(Pessimistic Lock)是两种经典的并发控制策略。本文将系统介绍两者的概念、适用场景、实现方式与优缺点。

1 悲观锁(Pessimistic Lock)

1.1 概念

悲观锁是一种对并发操作 持"悲观态度 "的机制,它认为数据在高并发环境下很可能会被其他线程修改 ,因此在数据访问期间直接++加锁++ ,++防止其他线程读写++,确保操作的安全性。

1.2 实现方式

  • 数据库层面加锁 :如使用 SQL 的 SELECT ... FOR UPDATE,会锁定查询的记录 ,直到事务提交或回滚

    BEGIN;
    SELECT * FROM product WHERE id=1 FOR UPDATE;
    -- 执行更新操作
    UPDATE product SET stock = stock - 1 WHERE id = 1;
    COMMIT;

  • Java 中的 synchronized、ReentrantLock 等属于悲观锁机制的典型应用。

1.3 适用场景

  • 写操作频繁,冲突概率高;

  • 数据一致性要求极高,不能容忍冲突后回滚;

  • 适用于传统数据库事务强一致的场景。

2 乐观锁(Optimistic Lock)

2.1 概念

乐观锁是一种对并发操作持"乐观态度 "的机制,它认为++数据冲突的概率较低++ ,因此不加锁 ,只在更新数据时检查是否有冲突。

2.2 实现方式

最常见的是使用 **版本号(version)或时间戳(timestamp)**进行并发控制。

  • 读取数据时同时读取版本号;

  • 更新时检查当前版本号是否与数据库中一致

  • 一致则更新,并将版本号加1;否则表示有并发冲突,放弃更新或重试。

2.3 适用场景

  • 读多写少,冲突概率低;

  • 业务可容忍失败重试机制;

  • 适用于分布式系统或无锁场景,如前端乐观更新、NoSQL 等。

3 乐观锁与悲观锁的对比

项目 乐观锁 悲观锁
加锁方式 不加锁,通过版本控制 加锁,阻止其他线程操作
并发性能 高,适合读多写少 低,适合写多读少
冲突处理 检测冲突后重试或报错 阻止冲突发生
数据一致性 可接受一定冲突 强一致性
适用场景 高并发、分布式、响应优先 单体服务、事务控制严格

在实际项目中,悲观锁适用于高冲突、高一致性需求的场景 ,而乐观锁适用于高并发、低冲突、性能优先的业务逻辑。两者没有绝对的优劣,关键是根据业务特点和架构设计做出合理权衡。

相关推荐
小短腿的代码世界4 分钟前
Qt定时器高精度架构:从QTimer源码到纳秒级定时调度
数据库·qt·架构
herinspace11 分钟前
管家婆辉煌软件如何新增往来单位档案分类
服务器·数据库·电脑·管家婆软件
程序猿乐锅11 分钟前
【MySQL | 第九篇】MySQL 存储过程
数据库·mysql
栗子~~23 分钟前
金融场景下BigDecimal 运算规范 + 常用场景使用 + 数据库字段设计详解
java·数据库·金融
他们叫我技术总监40 分钟前
Kettle(PDI)连接TDengine数据库实战:一个有趣的小现象
大数据·数据库·tdengine
SilentSamsara1 小时前
RAG 系统入门:LangChain/LlamaIndex + Chroma 向量数据库的检索增强实战
数据库·人工智能·python·青少年编程·langchain
RoboWizard1 小时前
一块硬盘上架前要闯多少关?
java·服务器·数据库
oyyanghh1 小时前
从Cursor到TRAE的三周vibe coding体验对比
数据库·oracle
Bert.Cai1 小时前
Oracle CONCAT函数详解
数据库·oracle
豆豆1 小时前
2026年如何选择适合自己的网站管理系统?
数据库·cms·wordpress·建站系统·网站管理系统·建站软件·织梦