MySQL 的乐观锁和悲观锁是什么?

在并发环境下,为了避免数据竞争和保证数据一致性,可以使用不同的锁策略。乐观锁和悲观锁是两种常见的并发控制机制,它们在锁定数据时的理念和实现方式上有显著区别。


1. 悲观锁(Pessimistic Lock)

定义

  • 悲观锁是一种保守的并发控制策略,假设数据在被访问时会发生并发修改,因此在操作数据之前会将其锁定,确保其他事务无法修改数据。
  • 使用悲观锁的事务在操作数据时会 主动加锁,以防止其他事务对数据的读写操作。

实现方式

  • 在 MySQL 中,悲观锁通常依赖于数据库的锁机制,例如 行锁表锁
  • 常用语法
    • 使用 SELECT ... FOR UPDATELOCK TABLES 来实现悲观锁。

示例

事务 A 和事务 B 需要修改同一条记录:

  1. 事务 A 执行以下语句:
START TRANSACTION; SELECT * FROM orders WHERE id = 1 FOR UPDATE;

此时,事务 A 加锁,事务 B 无法操作 id = 1 的记录。

  1. 事务 B 尝试修改相同记录时会被阻塞,直到事务 A 提交或回滚。

适用场景

  • 数据冲突较频繁的场景,例如高并发情况下对相同资源的修改操作。
  • 在修改之前需要保证数据的强一致性。

2. 乐观锁(Optimistic Lock)

定义

  • 乐观锁是一种开放的并发控制策略,假设数据在被操作期间不会发生冲突,因此不在操作前加锁,而是在提交数据时通过 冲突检测机制 检测是否存在数据竞争。
  • 如果检测到数据已被其他事务修改,则回滚并重新尝试。

实现方式

  • 乐观锁通常通过 版本号时间戳 来实现。
  • 常用逻辑
  1. 查询数据时,读取记录的版本号或时间戳。
  2. 修改数据时,检查记录的版本号或时间戳是否与查询时一致。
  3. 如果一致,则更新记录并增加版本号;否则,说明数据被其他事务修改,需要重试或终止操作。

示例

表结构如下:

CREATE TABLE orders ( id INT PRIMARY KEY, stock INT, version INT );

事务更新逻辑:

  1. 查询数据:
SELECT stock, version FROM orders WHERE id = 1;
  1. 更新数据:
UPDATE orders SET stock = stock - 1, version = version + 1 WHERE id = 1 AND version = 当前版本号;
  1. 检查受影响的行数:
  • 如果行数为 0,表示版本号已变化,需要重试或终止操作。

适用场景

  • 数据冲突较少的场景,例如读多写少的业务场景。
  • 高并发情况下,提高性能,同时保证一定程度的数据一致性。

3. 乐观锁与悲观锁的对比

对比项 乐观锁 悲观锁
理念 假设冲突很少,操作时不加锁,依赖冲突检测。 假设冲突频繁,操作时加锁,防止冲突发生。
实现方式 依赖版本号、时间戳或 CAS(Compare and Swap)。 使用数据库的锁机制,例如 FOR UPDATE
性能 无锁操作,性能较高,适合高并发场景。 需要加锁,性能较低,适合冲突频繁场景。
冲突检测 提交时检测是否冲突。 通过加锁避免冲突。
适用场景 读多写少,冲突较少的场景。 写多且冲突频繁的场景。

总结

  • 悲观锁 通过锁机制保证操作安全,适合冲突频繁的场景,但性能较低。
  • 乐观锁 依赖版本控制机制来检测冲突,适合冲突较少的高并发场景,性能更优。
  • 在实际开发中,可以根据具体业务需求选择合适的锁机制。例如:
  • 数据一致性要求极高时使用 悲观锁
  • 数据冲突概率较低时使用 乐观锁

MySQL 的乐观锁和悲观锁是什么?的更多相关文章

  1. mysql的锁--行锁,表锁,乐观锁,悲观锁

    一 引言--为什么mysql提供了锁 最近看到了mysql有行锁和表锁两个概念,越想越疑惑.为什么mysql要提供锁机制,而且这种机制不是一个摆设,还有很多人在用.在现代数据库里几乎有事务机制,aci ...

  2. 【数据库】mysql深入理解乐观锁与悲观锁

    转载:http://www.hollischuang.com/archives/934 在数据库的锁机制中介绍过,数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库中同一数据时 ...

  3. Mysql共享锁、排他锁、悲观锁、乐观锁及其使用场景

    一.相关名词 |--表级锁(锁定整个表) |--页级锁(锁定一页) |--行级锁(锁定一行) |--共享锁(S锁,MyISAM 叫做读锁) |--排他锁(X锁,MyISAM 叫做写锁) |--悲观锁( ...

  4. Mysql乐观锁与悲观锁

    乐观锁和悲观锁是两种常见的资源并发锁设计思路,也是并发编程中一个非常重要的基础理念. Mysql的悲观锁 什么是悲观锁(Pessimistic Lock): 悲观锁的特点是先获取锁,再进行业务操作,即 ...

  5. [转]MySQL中乐观锁、悲观锁(共享锁、排他锁)简介

    InnoDB与MyISAM Mysql 在5.5之前默认使用 MyISAM 存储引擎,之后使用 InnoDB. MyISAM 操作数据都是使用的表锁,你更新一条记录就要锁整个表,导致性能较低,并发不高 ...

  6. MySQl中隔离级别和悲观锁乐观锁

    1.MySql的事物支持 MySQL的事务支持不是绑定在MySQL服务器本身,而是与存储引擎相关: MyISAM:不支持事务,用于只读程序提高性能 InnoDB:支持ACID事务.行级锁.并发 Ber ...

  7. MySQL 乐观锁与悲观锁

    悲观锁 悲观锁(Pessimistic Lock),顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁. 悲观锁: ...

  8. mysql中的乐观锁和悲观锁

    mysql中的乐观锁和悲观锁的简介以及如何简单运用. 关于mysql中的乐观锁和悲观锁面试的时候被问到的概率还是比较大的. mysql的悲观锁: 其实理解起来非常简单,当数据被外界修改持保守态度,包括 ...

  9. MySQL学习(四)深入理解乐观锁与悲观锁

    转载自:http://www.hollischuang.com/archives/934 在数据库的锁机制中介绍过,数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库中同一数据 ...

  10. 老司机带大家领略MySQL中的乐观锁和悲观锁

    原文地址:https://cloud.tencent.com/developer/news/227982 为什么需要锁 在并发环境下,如果多个客户端访问同一条数据,此时就会产生数据不一致的问题,如何解 ...

随机推荐

  1. 深入理解Java泛型、协变逆变、泛型通配符、自限定

    禁止转载 重写了之前博客写的泛型相关内容,全部整合到这一篇文章里了,把坑都填了,后续不再纠结这些问题了.本文深度总结了函数式思想.泛型对在Java中的应用,解答了许多比较难的问题. 纯函数 协变 逆变 ...

  2. Git的一些基本用法

    本文分享自天翼云开发者社区<Git的一些基本用法>,作者:l****n 基本操作 git branch 查看当前分支 git branch -a 查看所有分支 git pull 更新当前分 ...

  3. Q:Linux符号连接的层数过多

    创建符号链接的时候源文件一定要使用绝对路径,尤其是链接不在同一目录时候,用相对路径会出现这种bug,具体是红色闪烁状态.:正常应该是青绿色  例如: 安装zabbix_agent遇到的问题,在root ...

  4. 洛谷P2789 直线交点数 题解

    解题思路 考虑将直线分组,每组内直线互相平行,任意两组直线间交点数量等于两组内直线数量乘积. 分组操作使用dfs,求出交点数量后加入set去重,输出set大小. 时间复杂度O(2NN2)有点鬼畜但是可 ...

  5. Linux目录管理命令

    1. pwd :显示当前所在目录的路径 1.1 语法格式 pwd #直接按回车键 1.2 实践案例 案例:查看当前所在目录路径 [root@yyds ~]# pwd /root --->显示的是 ...

  6. MacOS15+Xcode版本16+对ReactNative项目进行编译和上传到APPStore的踩坑记录

    作者:Kovli 重要通知:红宝书第5版2024年12月1日出炉了,感兴趣的可以去看看,https://u.jd.com/saQw1vP 红宝书第五版中文版 红宝书第五版英文原版pdf下载(访问密码: ...

  7. [计算机/硬件/GPU] 显卡

    序 截至2025年,全球主流的AI大模型满血版的参数量均已突破百亿级,算力需求正以指数级飙升.特别是 DeepSeek 公司旗下的 R1 系列模型的问世,推动了很多中小企业部署私有化模型的需求. 然而 ...

  8. 深入解析NoSQL数据库:从文档存储到图数据库的全场景实践

    title: 深入解析NoSQL数据库:从文档存储到图数据库的全场景实践 date: 2025/2/19 updated: 2025/2/19 author: cmdragon excerpt: 通过 ...

  9. 解决黑群晖 Docker 日志八小时时间差的有效方法

    步骤一:登录黑群晖控制台 首先,我们需要登录到黑群晖控制台.可以通过SSH登录,或是直接在黑群晖控制台界面上操作. 步骤二:停止相关的Docker容器 在解决时间差问题之前,我们需要停止相关的Dock ...

  10. autMan奥特曼机器人-实时翻译的用法

    一.基本配置 访问并登录百度翻译开放平台:https://api.fanyi.baidu.com/ 进入开发者信息获取 APP ID和密钥,并开通"通用文本翻译"服务 autMan ...