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. Linux基础:用户与用户组

  2. ASP.NET Core 快速轻量级的浏览器检测和设备检测库

    在 .NET Framework 4.7 中那样,通过 HttpContext.Request 的 Browser 属性轻松获取发起 HTTP 请求的浏览器信息,ASP.NET Core 并未直接提供 ...

  3. Docker部署Go+Mysql+Redis

    两种方式Docker和Docker Compose部署web项目,相对于Go语言来说,不管是使用docker部署还是直接服务器部署都相当方便,比python要简单很多. 1.Dockerfile结构解 ...

  4. 利用Python开发Exporter,集成Prometheus和Grafana对进程监控

    利用Python开发Exporter,集成Prometheus和Grafana对进程监控 在现代软件开发和运维中,监控是确保系统稳定运行和快速响应问题的重要手段.Prometheus和Grafana的 ...

  5. Q:Tomcat使用的jdk版本而不依赖环境变量

    1)在tomcat中显式配置-JVM启动使用内存大小 解决:vim打开tomcat目录下的bin/catalina.sh文件,在文件最上部配置JAVA_OPTS属性. windows下在catalin ...

  6. Luogu P4425 转盘 题解 [ 黑 ] [ 线段树 ] [ 贪心 ] [ 递归 ]

    转盘:蒟蒻的第一道黑,这题是贪心和线段树递归合并的综合题. 贪心 破环成链的 trick 自然不用多说. 首先观察题目,很容易发现一个性质:只走一圈的方案一定最优.这个很容易证,因为再绕一圈回来标记前 ...

  7. TensorFlow函数 tf.argmax()

    参数: input:输入数据 dimension:按某维度查找. dimension=0:按列查找: dimension=1:按行查找: 返回: 最大值的下标 import tensorflow.co ...

  8. ABB机器人IO板DSQC651维修检查方法

    ABB机器人作为工业自动化的重要设备,其稳定性和可靠性对于生产线的持续运行至关重要.然而,在实际使用中,由于各种原因,可能会出现ABB机器人IO板DSQC651故障,影响机器人的正常运行. 一.ABB ...

  9. 3. Nginx 命令行参数 & nginx.conf 配置文件的详细说明(附有截图说明)

    3. Nginx 命令行参数 & nginx.conf 配置文件的详细说明(附有截图说明) @ 目录 3. Nginx 命令行参数 & nginx.conf 配置文件的详细说明(附有截 ...

  10. 使用DeepSeek-R1分析电影票房

    最近在学习DeepSeek-R1本地化部署的相关知识,看到了1个比较有意思的视频. 在该视频中,其主要逻辑就是当用户上传1个Excel后,之后就可以通过交互式的方式对这个Excel中的数据进行分析.但 ...