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

Mysql--技术文档--悲观锁、乐观锁-《控制并发机制简单认知、深度理解》

阿丹:

        首先在谈到并发控制机制的时候,我们通常会提及两种重要的锁策略。悲观锁(Pessimistic Locking)和乐观锁(Optimistic Locking)。这两个是在处理并发的时候采取的不同思路。

悲观锁:

        悲观锁: 悲观锁机制认为并发操作中会有冲突,因此默认情况下假设会出现并发冲突,因此采取阻止或延迟访问的方式来保证一致性和隔离性。悲观锁的基本思想是,在数据的访问和修改过程中,假设其他事务会对该数据进行修改,因此在操作数据之前,先获取锁来保护资源的完整性。

当一个事务试图获取悲观锁时,它会将资源标记为已锁定状态,其他事务如果要访问该资源,必须等待锁释放。这种锁定通常是独占锁,在锁被持有期间,其他事务无法读取或修改数据,从而保证了数据的一致性和隔离性。悲观锁常用的实现方式是加锁机制,如共享锁(Shared Lock)和排他锁(Exclusive Lock)。

阿丹解读:

        就是悲观锁认为所有的资源都要使用我这个,然后当我在执行一个事务的时候,我就给所有的东西锁死了。一直到我解决完了当前的事务别人才能从我这里访问资源。如果我在锁上的时候啥我都不给。悲观锁说我要保证一致性,所以就进行了独占锁(排他锁)。来解决冲突。

乐观锁

        乐观锁: 乐观锁机制则采取了一种更加乐观的假设,它认为并发操作中冲突的概率较低。乐观锁的基本思想是,在操作数据之前,不会加锁,也不会阻止其他事务的并发访问。相反,事务在进行修改前,会先获取数据的一个快照或版本,并在操作完成时对数据进行一致性验证。

        在乐观锁中,每个事务通常会关联一个版本号、时间戳或序列号,这些信息用于识别数据的版本。在读取和修改数据时,事务会使用这些信息来验证数据是否被其他事务修改过。如果数据的版本与事务启动时的版本一致,则可以继续操作;如果版本不一致,说明在操作过程中数据已被修改,乐观锁机制会回滚事务或触发相应的冲突处理逻辑。

        乐观锁常用的实现方式包括添加额外的字段来记录版本信息,例如在数据库中添加一个版本号字段或使用时间戳来标记数据的更新时间。

        悲观锁和乐观锁各有优缺点,适用于不同的场景。悲观锁机制保证了数据的强一致性和隔离性,但可能导致较高的锁冲突和性能开销。乐观锁机制允许更高的并发性能,但需要应用程序代码对冲突进行适当处理,以保证数据的一致性。

阿丹解读:

        乐观锁其实就是在我去进行数据库落库操作之前的之前,谁来读取我都给。因为我在我进行逻辑操作计算的时候保存了一个类似于快照的东西。乐观锁只需要在落库之前对比一下我的数据和快照一样不一样,如果一样就说明我没和别人冲突就正常落库。如果不一样就是在我进行计算的时候有人和我冲突了。我就回滚。

        所以乐观锁只锁了写没有锁读,所以对于其他的事务来说更友好。乐观锁对操作加了锁。

其他的并发控制机制

在数据库系统中,常用的并发控制机制包括以下几种:

  1. 锁机制(Locking):锁机制是最常见、最基本的并发控制机制之一。它通过使用锁来保护共享资源,防止多个事务同时读取或修改同一份数据。锁可以分为共享锁(Shared Lock)和排他锁(Exclusive Lock),以允许读取共享数据或独占修改数据。

  2. 多版本并发控制(MVCC,Multi-Version Concurrency Control):MVCC通过对数据的版本管理来实现并发控制。它为每个事务创建数据的独立版本,并通过版本号或时间戳来识别数据的不同版本,从而避免了读-写冲突和写-写冲突。MVCC通常使用乐观锁来进行并发控制。

  3. 串行化(Serializability):串行化是一种较为保守的并发控制机制,它确保事务以串行的方式执行,从而避免了并发冲突。串行化通常使用锁机制、时间戳或序列号等方式来实现,但由于事务的串行执行,可能会导致性能瓶颈。

  4. 快照隔离(Snapshot Isolation):快照隔离是一种基于版本管理的并发控制机制,它为每个事务提供一个快照(Snapshot)来读取数据。每个事务在开始时读取数据的快照,并在事务提交时进行验证。快照隔离提供了较高的并发性能和隔离性,但可能导致一些读取操作的不一致性。

  5. 时间戳排序(Timestamp Ordering):时间戳排序是一种并发控制机制,它通过为每个事务分配全局唯一的时间戳来实现。事务按时间戳的先后顺序执行,从而避免了并发冲突。时间戳排序通常需要一个中心时钟或全局时钟来生成时间戳。

相关文章:

Mysql--技术文档--悲观锁、乐观锁-《控制并发机制简单认知、深度理解》

阿丹: 首先在谈到并发控制机制的时候,我们通常会提及两种重要的锁策略。悲观锁(Pessimistic Locking)和乐观锁(Optimistic Locking)。这两个是在处理并发的时候采取的不同思路。 悲观锁: 悲观锁…...

【GO】LGTM_Grafana_Tempo(2)_官方用例改后实操

最近在尝试用 LGTM 来实现 Go 微服务的可观测性,就顺便整理一下文档。 Tempo 会分为 4 篇文章: Tempo 的架构官网测试实操跑通gin 框架发送 trace 数据到 tempogo-zero 微服务框架使用发送数据到 tempo 根据官方文档实操跑起来 tempo,中间根…...

git 口令

把当前目录变成 Git 可以管理的仓库: git init 下载一个项目和它的整个代码历史 git clone [url] 切换到 develop 分支: git checkout develop 建立并切换到 new 分支 git checkout -b new 查看所有分支: git branch -a 删除 tese …...

【回眸】剑指offer(二)解题思路

题解 | #数字在升序数组中出现的次数# JZ3数字在升序数组中出现的次数 描述 给定一个长度为 n 的非降序数组和一个非负数整数 k ,要求统计 k 在数组中出现的次数 数据范围:0≤n≤1000,0≤k≤100,数组中每个元素的值满足 0≤val≤100 要求…...

Python 基本文件操作及os库

内置函数文件操作 python内置函数提供了简单的文件操作支持。 open() open()函数打开一个文件,创建一个file对象,相关的方法才可以调用它进行读写。 语法为: open(file,moder,buffering-1,encodingNone,errorsNone,newlineNone,closefdT…...

YOLOv5算法改进(9)— 替换主干网络之ShuffleNetV2

前言:Hello大家好,我是小哥谈。ShuffleNetV2 是一种轻量级的神经网络架构,适用于移动设备和嵌入式设备等资源受限的场景,旨在在计算资源有限的设备上提供高效的计算和推理能力,它通过引入通道重排操作和逐点组卷积来减…...

三、mycat分库分表

第五章 分库分表 一个数据库由很多表的构成,每个表对应着不同的业务,垂直切分是指按照业 务将表进行分类,分布到不同 的数据库上面,这样也就将数据或者说压力分担到不同 的库上面,如下图: 系统被切分成了&…...

gitlab提交项目Log in with Access Token错误

目录 报错信息 问题描述 解决方案 报错信息 问题描述 在提交项目到gitlab时,需要添加账户信息 ,但是报了这样一个错,原因应该就是路径问题,我在填写server地址的时候,就出现了路径问题,我把多余的几个/…...

openGauss学习笔记-56 openGauss 高级特性-DCF

文章目录 openGauss学习笔记-56 openGauss 高级特性-DCF56.1 架构介绍56.2 功能介绍56.3 使用示例 openGauss学习笔记-56 openGauss 高级特性-DCF DCF全称是Distributed Consensus Framework,即分布式一致性共识框架。DCF实现了Paxos、Raft等解决分布式一致性问题典…...

Xcode 14 pod init报错

文章目录 1.报错2.解决方法(本人亲测有效) 1.报错 [!] Oh no, an error occurred. Search for existing GitHub issues similar to yours: https://github.com/CocoaPods/CocoaPods/search?q%5BXcodeproj%5DUnknownobjectversion%2856%29.&typeIs…...

飞腾PSPA可信启动--2 数字签名证书

今天继续第二章,数字签名证书的介绍。 此章节录制了讲解视频,可以在B站进行观看:...

微前端:重塑大型项目的前沿技术

引言 随着互联网技术的飞速发展,前端开发已经从简单的页面制作逐渐转变为复杂的应用开发。在这个过程中,传统的前端开发模式已经难以满足大型项目的需求。微前端作为一种新的前端架构模式,应运而生,它旨在解决大型项目中的前端开…...

官方推荐使用的OkHttp4网络请求库全面解析(Android篇)

作者:cofbro 前言 现在谈起网络请求,大家肯定下意识想到的就是 okhttp 或者 retrofit 这样的三方请求库。诚然,现在有越来越多的三方库帮助着我们快速开发,但是对于现在的程序员来说,我们不仅要学会如何去用&#xff…...

Spooling的原理

脱机技术 程序猿先用纸带机把自己的程序数据输入到磁带中,这个输入的过程是由一台专门的外围控制机实现的。之后CPU直接从快速的磁带中读取想要的这些输入数据。输出也类似。 假脱机技术(Spooling技术) 即用软件的方式来模拟脱机技术。要…...

Homebrew 无法安装过时的PHP版本

使用brew安装过时的PHP版本时,提示“Error: php7.4 has been disabled because it is a versioned formula!”错误。 因为过时的PHP版本官方已经不再维护,所以Hombrew将该PHP版本移出了repository,所以安装不了。 解决方案 # 1. 添加tap fo…...

python爬取bilibili,下载视频

一. 内容简介 python爬取bilibili,下载视频 二. 软件环境 2.1vsCode 2.2Anaconda version: conda 22.9.0 2.3代码 链接:https://pan.baidu.com/s/1WuXTso_iltLlnrLffi1kYQ?pwd1234 三.主要流程 3.1 下载单个视频 代码 import requests impor…...

java八股文面试[多线程]——进程与线程的区别

定义 1、进程:进程是一个具有独立功能的程序关于某个数据集合的以此运行活动。 是系统进行资源分配和调度的独立单位,也是基本的执行单元。是一个动态的概念,是一个活动的实体。它不只是程序的代码,还包括当前的活动。 进程结构…...

SpringBootWeb 登录认证[Cookie + Session + Token + Filter + Interceptor]

目录 1. 登录功能 1.1 需求 1.2 接口文档 1.3 登录 - 思路分析 1.4 功能开发 1.5 测试 2. 登录校验 2.1 问题分析 什么是登录校验? 我们要完成以上登录校验的操作,会涉及到Web开发中的两个技术: 2.2 会话技术 2.2.1 会话技术介绍…...

d3dcompiler_43.dll丢失怎么修复,分享几种修复d3dcompiler_43.dll的方法

不少人可能看到d3dcompiler_43.dll这个文件会感觉到陌生,是的,因为这个文件一般来说是很少丢失的,但是还是会出现d3dcompiler_43.dll丢失的情况的,今天主要是来给大家详细的说说d3dcompiler_43.dll丢失怎么修复的相关方法。 一.分…...

mqtt集群搭建并使用nginx做负载均衡_亲测得结论

mqtt集群搭建 RabbitMQ集群搭建和测试总结_亲测 搭建好RabbitMQ集群,并开启mqtt插件功能,mqtt集群也就搭建好了 nginx配置mqtt负载均衡 #修改rabbitmq1节点ip为1.19的nginx配置 vim /etc/nginx/nginx.confhttp { } #在http外添加如下配置 stream {upstream rabbitmqtt {ser…...

Megatron-LM源码解析:Tensor与Sequence并行训练中的通信优化策略

1. Megatron-LM并行训练基础概念 在分布式训练领域,Megatron-LM已经成为大规模语言模型训练的事实标准框架。我第一次接触这个框架时,就被它精妙的并行设计所震撼。Tensor并行和Sequence并行是其中两种核心并行策略,理解它们的通信机制对优化…...

终极TensorFlow Rust数学运算指南:从基础算术到复杂函数完全掌握

终极TensorFlow Rust数学运算指南:从基础算术到复杂函数完全掌握 【免费下载链接】rust Rust language bindings for TensorFlow 项目地址: https://gitcode.com/gh_mirrors/rust/rust TensorFlow Rust为开发者提供了强大的数学运算能力,通过Rust…...

Vibe coding对程序员的影响

一、深化核心能力数学与算法基础掌握离散数学、概率论等基础理论熟练应用动态规划、图论等算法范式示例:优化算法时间复杂度 O(n\log n)--O(n)系统设计能力理解计算机组成原理与操作系统机制构建高可用分布式系统(如CAP定理)二、适应技术演进…...

Minecraft启动器与游戏配置工具全攻略:从新手到大师的进阶指南

Minecraft启动器与游戏配置工具全攻略:从新手到大师的进阶指南 Minecraft启动器是每一位玩家进入方块世界的第一道门,而一款优秀的游戏配置工具则能让你的冒险之旅更加顺畅。本文将以玩家视角,带你深入了解如何利用PCL2-CE这款强大的开源工具…...

新手零基础入门:借助快马AI生成带注释的微信小程序示例代码

作为一个刚接触微信小程序开发的新手,我最近在InsCode(快马)平台上尝试了一个特别适合零基础学习的实践项目。这个平台最让我惊喜的是,只需要用自然语言描述需求,就能快速生成带详细注释的完整代码,这对理解小程序开发流程帮助很大…...

ai赋能开发:使用快马平台智能优化openclaw 101抓取控制算法

最近在优化一个机械臂抓取控制项目时,发现传统的手动调参和算法改进效率太低。正好尝试了InsCode(快马)平台的AI辅助开发功能,整个过程让我对智能化编程有了全新认识。下面分享用AI优化OpenClaw 101控制算法的完整经历: 原始问题分析 初始代码…...

如何用Obsidian构建你的个人知识管理系统:终极完整指南

如何用Obsidian构建你的个人知识管理系统:终极完整指南 【免费下载链接】kepano-obsidian My personal Obsidian vault template. A bottom-up approach to note-taking and organizing things I am interested in. 项目地址: https://gitcode.com/gh_mirrors/ke/…...

从宇宙到地面:解析ICRS、GCRS、CIRS、TIRS和ITRS坐标系统的层级关系与应用场景

1. 从宇宙到地球:坐标系统的层级关系 想象一下你站在夜晚的旷野中仰望星空。那些闪烁的星星看似固定不动,但实际上它们的精确位置需要用一套复杂的坐标系统来描述。从天文学研究到日常导航,不同的坐标系统就像一套精密的俄罗斯套娃&#xff0…...

借助快马平台优化蓝桥杯python解题代码,提升算法执行效率

最近在准备蓝桥杯Python组的比赛,发现很多题目对算法效率要求很高。就拿经典的"最大子序列和"问题来说,不同的解法效率差异巨大。今天分享一下我是如何借助InsCode(快马)平台来快速验证不同解法的效率的。 问题理解 最大子序列和问题要求在一个…...

【AI智能体】Dify 实战:构建企业级自然语言SQL查询引擎

1. 从个人工具到企业级解决方案的跨越 第一次接触Dify的自然语言转SQL功能时,我被它的便捷性惊艳到了。只需要输入"显示上季度销售额最高的产品",系统就能自动生成正确的SQL语句。但当我尝试在团队中推广使用时,各种问题接踵而至&a…...