MySQL数据库笔记——版本号机制和CAS(Compare And Swap)

大家好,这里是Good Note,关注 公主号:Goodnote,本文详细介绍乐观锁的两种实现方式:版本号机制和CAS(Compare And Swap)。

在这里插入图片描述

文章目录

    • MySQL 内置的并发控制机制
      • MVCC(多版本并发控制)
      • 锁机制
      • 总结
    • 乐观锁实现方式(需要手动实现)
      • 1. 版本号机制
        • 实现步骤
        • 示例
        • 优缺点
      • 2. CAS(Compare And Swap)
        • 实现步骤
        • 示例:Go 中 CAS 实现
        • 优缺点
      • 3. 版本号机制 vs CAS
    • 历史文章

MySQL 内置的并发控制机制

MySQL 内置了强大的并发控制机制,例如 MVCC(多版本并发控制) 和锁机制。这些机制在更高层次上实现了并发控制。自动处理事务隔离和并发冲突,适用于复杂数据库事务管理。

MVCC(多版本并发控制)

  • 核心:基于事务 ID 和 Undo Log,实现高效的读写并发。
  • 特点:快照读无需加锁,写操作使用回滚日志实现隔离性。

锁机制

  1. 按锁粒度表锁行锁(InnoDB 默认)。

  2. 按锁类型共享锁(S 锁)排他锁(X 锁)

  3. 意向锁:用于标记表中是否有行级锁,避免加锁冲突。

  4. 按加锁机制分:悲观锁和乐观锁。

    • 悲观锁:通过显式加锁防止并发冲突。
    • 乐观锁:通过版本号机制和CAS实现,本文重点

锁的详细信息参考:MySQL面试之——锁的分类

总结

机制程序员实现MySQL 支持
版本号机制程序员设计表结构,手动添加 version 字段和条件更新MySQL 不直接支持,由程序员通过 SQL 手动实现
CAS程序员通过 SQL 条件更新模拟类似行为MySQL 不支持硬件级 CAS,仅能通过条件更新实现
MVCC程序员无需手动实现MySQL 内置支持,通过事务 ID 和 Undo Log 实现
  • 程序员实现的版本号机制和 CAS
    • 需要手动设计表结构、编写 SQL。
    • 适用于轻量级业务逻辑的并发控制。

乐观锁实现方式(需要手动实现)

版本号机制CAS(Compare And Swap) 是实现 乐观锁 的两种常见方式,它们的核心思想是通过条件检查来保证并发安全。以下是两种方法的实现详细介绍:


1. 版本号机制

MySQL 本身并未内置对 版本号机制 的直接支持。版本号机制通常由应用程序开发人员在数据库设计和操作层手动实现。

基本原理

  • 为每一条记录添加一个额外的字段(版本号)。
  • 在更新数据时,先检查版本号是否与读取时一致,再执行更新。
  • 版本号的变化表明数据已经被其他事务修改,当前事务需要重新尝试或放弃。
实现步骤
  1. 读取数据和版本号

    • 查询需要更新的记录,并获取当前版本号。
    SELECT version, value FROM table_name WHERE id = 1;
    
  2. 检查版本号并更新

    • 在更新时,检查版本号是否一致。
    • 如果一致,执行更新并将版本号加 1。
    UPDATE table_name
    SET value = 'new_value', version = version + 1
    WHERE id = 1 AND version = 10;
    
  3. 处理并发冲突(如果存在)

    • 如果 WHERE 子句中的 version 不匹配,说明该记录已被其他事务修改,当前事务更新失败。
示例

假设表结构如下:

CREATE TABLE table_name (id INT PRIMARY KEY,value VARCHAR(255),version INT
);

事务 A:

SELECT version, value FROM table_name WHERE id = 1; -- 返回 version = 10
UPDATE table_name SET value = 'new_value', version = version + 1 WHERE id = 1 AND version = 10;

事务 B(同时运行):

SELECT version, value FROM table_name WHERE id = 1; -- 返回 version = 10
UPDATE table_name SET value = 'another_value', version = version + 1 WHERE id = 1 AND version = 10; -- 更新失败
优缺点
  • 优点
    • 不需要加锁,性能高。
    • 简单易实现。
  • 缺点
    • 需要额外的字段存储版本号。
    • 并发冲突时,需要重试或回滚,可能增加系统开销。

2. CAS(Compare And Swap)

MySQL 不直接支持类似硬件级别的 CAS 操作。对于类似 CAS 的功能,依赖程序员通过代码实现【也有说通过 SQL 实现】。

基本原理

  • CAS 是一种原子操作,用于更新某个值时,先比较当前值是否符合预期。
  • 如果当前值符合预期,则执行更新,否则不更新。
实现步骤
  1. 读取数据的当前值

    • 获取目标变量的当前值。
  2. 比较值是否符合预期

    • 如果当前值与预期值一致,说明没有其他线程修改过该值。
  3. 更新数据

    • 在当前值符合预期时,执行更新。
    • 如果值不一致,操作失败,可以选择重试。
示例:Go 中 CAS 实现

Go 中的 CAS 使用 sync/atomic 包提供的 CompareAndSwap 系列方法。

package mainimport ("fmt""sync/atomic"
)func main() {var counter int32 = 10// 期望值是 10,新值是 11success := atomic.CompareAndSwapInt32(&counter, 10, 11)if success {fmt.Printf("Update successful, new value: %d\n", counter)} else {fmt.Printf("Update failed, current value: %d\n", counter)}
}

补充:也有说可以通过SQL实现,SQL实现,本质上和版本号机制一样,不一样的点在于不需要额外字段,直接操作数据值(count)。如下:

-- 假设表结构如下:
CREATE TABLE counter (id INT PRIMARY KEY,count INT );-- 当前 count = 10 
UPDATE counter SET count = count + 1 WHERE id = 1 AND count = 10; 
优缺点
  • 优点
    • 无需加锁,性能高。
    • 操作是原子的,由硬件保证一致性。
  • 缺点
    • 存在 ABA 问题(值从 A 改为 B,又改回 A,CAS 不会察觉)。
    • 如果冲突频繁,可能导致多次重试。

3. 版本号机制 vs CAS

特性版本号机制CAS
实现方式基于字段的版本号,依赖 SQL 条件更新或程序逻辑基于硬件支持的原子操作,直接比较并更新
字段要求需要额外的版本号字段(version不需要额外字段,直接操作数据值
适用场景数据库或程序语言中的并发控制程序语言中的并发控制,数据库中可通过条件更新模拟
是否依赖数据库通常依赖 SQL 实现,但也可在程序中实现不依赖数据库,可直接通过程序实现
优点简单易用,适合数据库复杂业务场景高性能,无需锁,硬件原子操作支持
缺点存在重试开销,版本号字段增加存储开销存在 ABA 问题,冲突频繁时重试代价较高

两者适用于不同的场景,但核心思想相同:通过比较条件,确保操作的正确性。

版本号机制和 CAS 的实现方式在不同层面有区别。以下是对它们在 程序员实现MySQL 内部支持 上的区别详细分析:

历史文章

  1. MySQL数据库笔记——数据库三范式
  2. MySQL数据库笔记——存储引擎(InnoDB、MyISAM、MEMORY、ARCHIVE)
  3. MySQL数据库笔记——常见的几种锁分类
  4. MySQL数据库笔记——索引介绍
  5. MySQL数据库笔记——事务介绍
  6. MySQL数据库笔记——索引结构之B+树
  7. MySQL数据库笔记——索引潜规则(回表查询、索引覆盖、索引下推)
  8. MySQL数据库笔记——索引潜规则(最左前缀原则)
  9. MySQL数据库笔记——常见慢查询优化方式
  10. MySQL数据库笔记——日志介绍
  11. MySQL数据库笔记——多版本并发控制MVCC
  12. MySQL数据库笔记——主从复制

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/7791.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度解析:基于Vue 3与Element Plus的学校管理系统技术实现

一、项目架构分析 1.1 技术栈全景 核心框架:Vue 3 TypeScript UI组件库:Element Plus(含图标动态注册) 状态管理:Pinia(用户状态持久化) 路由方案:Vue Router(动态路…

想品客老师的第七天:闭包和作用域

闭包之前的内容写在这里 环境、作用域、回收 首先还是数据的回收问题,全局变量一般都是通过关闭页面回收的;而局部变量的值不用了,会被自动回收掉 像这种写在全局里的就不会被主动回收捏: let title 荷叶饭function fn() {ale…

写一个存储“网站”的网站前的分析

要创建一个能够存储自己网站内容的“网站”,通常意味着你希望有一个可以存储网站数据、文件、内容等信息的系统。为了实现这一目标,可以考虑构建一个内容管理系统(CMS),这个系统能够帮助你存储和管理网站上的内容。 图片仅供参考 以下是如何实现一个可以存储自己网站内容…

aws(学习笔记第二十六课) 使用AWS Elastic Beanstalk

aws(学习笔记第二十六课) 使用aws Elastic Beanstalk 学习内容: AWS Elastic Beanstalk整体架构AWS Elastic Beanstalk的hands onAWS Elastic Beanstalk部署node.js程序包练习使用AWS Elastic Beanstalk的ebcli 1. AWS Elastic Beanstalk整体架构 官方的guide AWS…

从0到1:C++ 开启游戏开发奇幻之旅(一)

目录 为什么选择 C 进行游戏开发 性能卓越 内存管理精细 跨平台兼容性强 搭建 C 游戏开发环境 集成开发环境(IDE) Visual Studio CLion 图形库 SDL(Simple DirectMedia Layer) SFML(Simple and Fast Multim…

vim的多文件操作

[rootxxx ~]# vim aa.txt bb.txt cc.txt #多文件操作 next #下一个文件 prev #上一个文件 first #第一个文件 last #最后一个文件 快捷键: ctrlshift^ #当前和上个之间切换 说明:快捷键ctrlshift^&#xff0c…

安宝特方案 | AR在供应链管理中的应用:提升效率与透明度

随着全球化的不断深入和市场需求的快速变化,企业对供应链管理的要求也日益提高。如何在复杂的供应链环境中提升效率、降低成本,并确保信息的透明度,成为了各大行业亟待解决的问题。而增强现实(AR)技术,特别…

【ES实战】治理项之索引模板相关治理

索引模板治理 文章目录 索引模板治理问题现象分析思路操作步骤问题程序化方案索引与索引模板增加分片数校验管理 彩蛋如何查询Flink on Yarn 模式下的Task Manager日志相关配置查询已停止的Flink任务查询未停止的Flink任务 问题现象 在集群索引新建时,索引的分片比…

winfrom项目,引用EPPlus.dll实现将DataTable 中的数据保存到Excel文件

最近研究不安装office也可以保存Excel文件,在网上查询资料找到这个方法。 第一步:下载EPPlus.dll文件(自行去网上搜索下载) 第二步:引用到需要用的项目中,如图所示: 第三步:写代码…

Unity git版本管理

创建仓库的时候添加了Unity的.gitignore模版,在这个时候就能自动过滤不需要的文件 打开git bash之后,步骤git版本管理-CSDN博客 如果报错,尝试重新进git 第一次传会耗时较长,之后的更新就很快了

分布式微服务系统简述

distributed microservice 分布式与微服务的定义及关系;分布式微服务架构里的各组件,如:配置中心、服务注册/发现、服务网关、负载均衡器、限流降级、断路器、服务调用、分布式事务等;spring cloud 介绍及实现案例,如…

npm启动前端项目时报错(vue) error:0308010C:digital envelope routines::unsupported

vue 启动项目时,npm run serve 报下面的错: error:0308010C:digital envelope routines::unsupported at new Hash (node:internal/crypto/hash:67:19) at Object.createHash (node:crypto:133:10) at FSReqCallback.readFileAfterClose [as on…

国产编辑器EverEdit - 大纲视图

1 大纲视图 1.1 应用场景 在编辑较长代码文件时,使用大纲视图可以方便的检视当前文件的变量、函数等信息,方便在不同函数间跳转,对整个文档的全貌了然于胸。   在编辑XML文档时,通过展示XML文件的层次结构、节点布局&#xff0…

FastExcel的使用

前言 FastExcel 是一款基于 Java 的开源库,旨在提供快速、简洁且能解决大文件内存溢出问题的 Excel 处理工具。它兼容 EasyExcel,提供性能优化、bug 修复,并新增了如读取指定行数和将 Excel 转换为 PDF 的功能。 FastExcel 的主要功能 高性…

GESP2024年3月认证C++六级( 第三部分编程题(1)游戏)

参考程序&#xff1a; #include <cstdio> using namespace std; const int N 2e5 5; const int mod 1e9 7; int n, a, b, c; int f[N << 1]; int ans; int main() {scanf("%d%d%d%d", &n, &a, &b, &c);f[N n] 1;for (int i n; i…

JVM深入学习(一)

目录 一.JVM概述 1.1 为什么要学jvm&#xff1f; 1.2 jvm的作用 1.3 jvm内部构造 二.JVM类加载 2.1类加载过程 2.2类加载器 2.3类加载器的分类 2.4双亲委派机制 三.运行时数据区 堆空间区域划分&#xff08;堆&#xff09; 为什么分区(代)&#xff1f;&#xff08…

java后端之事务管理

Transactional注解&#xff1a;作用于业务层的方法、类、接口上&#xff0c;将当前方法交给spring进行事务管理&#xff0c;执行前开启事务&#xff0c;成功执行则提交事务&#xff0c;执行异常回滚事务 spring事务管理日志&#xff1a; 默认情况下&#xff0c;只有出现Runti…

hadoop==docker desktop搭建hadoop

hdfs map readuce yarn https://medium.com/guillermovc/setting-up-hadoop-with-docker-and-using-mapreduce-framework-c1cd125d4f7b 清理资源 docker-compose down docker system prune -f

类和对象(4)——多态:方法重写与动态绑定、向上转型和向下转型、多态的实现条件

目录 1. 向上转型和向下转型 1.1 向上转型 1.2 向下转型 1.3 instanceof关键字 2. 重写&#xff08;overidde&#xff09; 2.1 方法重写的规则 2.1.1 基础规则 2.1.2 深层规则 2.2 三种不能重写的方法 final修饰 private修饰 static修饰 3. 动态绑定 3.1 动态绑…

Java 实现Excel转HTML、或HTML转Excel

Excel是一种电子表格格式&#xff0c;广泛用于数据处理和分析&#xff0c;而HTM则是一种用于创建网页的标记语言。虽然两者在用途上存在差异&#xff0c;但有时我们需要将数据从一种格式转换为另一种格式&#xff0c;以便更好地利用和展示数据。本文将介绍如何通过 Java 实现 E…