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. CRISP-DM的应用与理解

    本文分享自天翼云开发者社区<CRISP-DM的应用与理解>,作者:吴****嫄 CRISP-DM是一个数据挖掘项目规划的开放标准流程框架模型,主要分为业务理解.数据理解.数据准备.建模.评 ...

  2. 玩转云端|演唱会一票难求?快用天翼云边缘安全加速平台AccessOne!

    本文分享自天翼云开发者社区<玩转云端|演唱会一票难求?快用天翼云边缘安全加速平台AccessOne!>,作者:天翼云社区官方账号 Super Idol的笑容虽然非常甜 无数粉丝宝宝的心里却 ...

  3. 2024年! kali高级配置加一键教程加前人的经验加后人的实践

    2024年! kali高级配置加一键教程加前人的经验加后人的实践 记录一下配置kali的过程,方便下次需要直接复制粘贴 直接终端按照顺序输入就可以配置好 作者已踩点,请放心 kali更换国内源 sud ...

  4. GridControl 给选中的行添加边框显示

    实现方式,通过自定义 RowControl 的样式实现. 参考:https://supportcenter.devexpress.com/ticket/list?searchString=RowCel ...

  5. WinForm 多线程+委托来防止界面假死

    参考: http://www.cnblogs.com/xpvincent/archive/2013/08/19/3268001.html 当有大量数据需要计算.显示在界面或者调用sleep函数时,容易 ...

  6. js提示Cannot read property ‘replace‘ of undefined

    JS提示Cannot read property 'replace' of undefined 出现这个错误的原因一般是传的参数为null 在传参之前加个是否为null的判断可以解决异常.

  7. Typecho评论框加入七彩打字动画

    最终效果 使用步骤 对于 本主题,依次进入 控制台 - 外观 - 设置外观 - 主题自定义扩展,将以下代码加入到 自定义 HTML 元素拓展 - 在 body 标签结束前.其他主题,加入到主题对应的 ...

  8. hbase - [05] hbase关联hive

    一.配置 1.在hive的配置文件中配置HBASE_HOME(conf/hive-env.sh) export HBASE_HOME=/opt/module/hbase 2.将 conf/hive-e ...

  9. Processing 使用pixels[]像素数组绘制矩形rect和圆形ellipse

    余温 两次绘制了棋盘格,有了一些经验了,顺着学习态势,我们再接再厉,挖一些技巧.这一次要使用pixels[]数组绘制矩形rect和圆形ellipse,也就是代替rect()和ellipse()两个函数 ...

  10. Linux 环境变量指北

    Linux 环境变量指北 一.终端:Login Shell 二.Systemd 的配置方式 三.图形界面 DM(Display Manager) 显示管理器 DE(Desktop Environmen ...