当前位置: 首页 > article >正文

mysql 的乐观锁和 mvcc 是一回事吗

MySQL 的乐观锁和 MVCC(多版本并发控制)是两个不同的概念,尽管它们都涉及到并发控制和数据的一致性,但在设计目的和实现方式上存在本质区别。


1. 乐观锁

  • 概念
    乐观锁是一种用于解决并发更新冲突的控制机制。它假设数据在大部分情况下不会发生冲突,因此允许多个事务自由读取数据,只有在更新时才进行冲突检测。

  • 实现方式
    乐观锁通常通过应用层实现,依赖特定的字段(如版本号或时间戳)来判断数据是否被其他事务修改过:

    1. 读取数据时,获取一个版本号或时间戳。
    2. 更新数据时,检查版本号是否与读取时一致。如果一致,更新并将版本号加1;否则,事务失败或重试。
  • 优点

    • 适用于读多写少的场景,冲突较少时性能较高。
    • 简单易实现,不需要复杂的锁机制。
  • 缺点

    • 在高并发下写入冲突多时,重试成本较高。
  • 示例(SQL 版本控制)

-- 更新时检查版本号是否一致
UPDATE table_name
SET value = 'new_value', version = version + 1
WHERE id = 1 AND version = 5;

如果 version 不匹配,则表示数据已被修改,更新失败。


2. MVCC(多版本并发控制)

  • 概念
    MVCC 是一种数据库引擎内部实现的并发控制机制。它通过维护数据的多个版本来支持高并发事务,使读操作和写操作之间不直接阻塞。

  • 实现方式(在 MySQL 中)

    • MySQL 的 InnoDB 存储引擎通过 undo log 和事务快照实现 MVCC。
    • 每个事务根据其开始的快照读取数据,这样即使其他事务更新了数据,当前事务依然可以看到之前的版本。
    • MVCC 依赖于 READ COMMITTEDREPEATABLE READ 的隔离级别。
  • 优点

    • 提高了并发性能,读操作不会阻塞写操作。
    • 提供一致性视图(事务内看到的是一致的快照数据)。
  • 缺点

    • 内部实现复杂,可能导致额外的存储开销。
  • 示例

    • 在事务 A 中查询时可以看到事务开始时的快照,即使事务 B 更新了数据,事务 A 的视图不会改变。

对比总结

特性乐观锁MVCC
适用范围应用层、特定场景数据库存储引擎级别
实现方式通过版本号或时间戳控制冲突多版本管理,通过 undo log 实现
优点简单高效,适用于读多写少场景高并发读写性能,不需要显式加锁
缺点写多冲突时重试成本高需要额外的存储和性能开销
冲突检测更新时显式检测数据库引擎内部管理冲突

结论

不是一回事

乐观锁是更高层的并发控制策略,通常在应用层实现,用于显式地解决数据更新冲突。而 MVCC 是数据库存储引擎内部的一种实现机制,旨在优化事务的读写性能。

尽管它们都关注并发问题,但它们的应用场景和实现方式不同,可以结合使用。例如,在 MySQL 中使用 MVCC 提供一致性视图,同时在业务层用乐观锁控制特定场景下的冲突。


http://www.kler.cn/a/401902.html

相关文章:

  • Spring Security 中的 UserDetailsService(获取用户详细信息)
  • WebSocket简易聊天室实现(有详细解释)
  • 使用Python语言编写一个简单的网页爬虫,从网站上抓取指定关键词的新闻标题和链接。
  • 简单爬虫的实现
  • 小程序-基于java+SpringBoot+Vue的小区服务管理系统设计与实现
  • 力扣-Hot100-链表其三【算法学习day.36】
  • 初识arkts-类-接口
  • 关于php Datetime 时区转换因为timezone_version(时区版本)问题造成的时区转换问题
  • k8s默认使用的后端网络模式
  • 基于YOLOv8深度学习的智慧社区建筑外墙破损(裂缝、露筋、剥落)检测系统研究与实现(PyQt5界面+数据集+训练代码)
  • 【Pikachu】PHP反序列化RCE实战
  • Django数据库迁移与反向迁移处理方案分析
  • C#使用App.config读写配置键值的简单示例
  • E45.【C语言】练习:输入10个整数查找找并打印不相同的数字及个数
  • 测试杂文 - linux串口打印
  • Rust宏系列教程—自定义派生宏
  • uniapp开发的陪玩系统该如何实现后端PHP语言的书写?
  • Android集成FCM(Firebace Cloud Messaging )
  • 9.《滑动窗口篇》---①长度最小的子数组(中等)
  • Elasticsearch 查看磁盘占用 查看指定索引磁盘占用