乐观锁的简单感悟

乐观锁(Optimistic Locking)是一种并发控制机制,用于解决多个线程或进程同时访问共享资源时可能发生的冲突问题。与悲观锁不同,乐观锁假设冲突很少发生,因此不会对整个操作过程进行严格的加锁。

乐观锁的实现方式通常有以下几种:

版本号(Versioning): 在数据表中增加一个版本号字段,每次更新数据时,版本号会随之增加。在进行数据更新时,检查当前的版本号是否与自己持有的版本号一致,若一致则进行更新,否则表示已经有其他线程修改了数据。

时间戳(Timestamp): 类似于版本号,但是使用时间戳来标记数据的更新时间。每次更新数据时,将当前时间戳写入数据表中,更新时检查时间戳是否一致。

CAS(Compare and Swap): 使用原子操作的方式进行比较和交换。在更新数据时,比较当前值与期望值是否一致,如果一致则进行交换操作,否则表示已经有其他线程修改了数据。


对于常规博客介绍乐观锁可能就止步于此了其实他们并没有真正讲清楚至关重要的问题;也就是实现的技术细节在哪里?
我个人观点,实现这个技术操作的核心在于乐观锁的思想。

乐观锁的基本思想是,在进行并发操作之前,先获取数据的版本或时间戳信息。当多个线程或进程同时访问相同的数据时,各自会获取到当前的版本或时间戳,并在操作完成后,比较自己的版本或时间戳与数据库中的版本或时间戳是否一致(关键一步,这一步必须是原子性的)。

我们可以分析到,无论是CAS,或者说是数据库层面上的基于版本号控制,其实都有一个关键技术,就是要确保修改的原子性,在读取这个版本号(比较期望值)或者说是读取内存中的值(比较期望值),之后如果判断成功是,则开始尝试去修改它,而修改这个操作需要是原子性的;CAS可以保证原子性,而数据库的update操作也是可以保证原子性;所以乐观锁才得以实现;都是需要基于底层提供的原子操作最终实现的乐观锁操作;

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

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

相关文章

Unity 通过鼠标移动和LineRenderer组件实现画线功能

在Unity中,使用LineRenderer组件可以在场景中绘制简单的线条,所以我们要实现通过鼠标移动来绘制线条的功能,可以使用LineRenderer组件实现。 要灵活进行绘制,那么就需要全程使用代码控制,包括线条的创建和基本属性设置…

KingSCADA|问题处理:数据输入后,数据已经写入,但SCADA界面显示为0问题。

哈喽,你好啊!我是雷工! 最近做KingSCADA项目遇到这么一个问题: KingSCADA系统和三菱的PLC通讯,当数值输入数据需要数据后,输入的数值点击确定按钮可以写入到PLC内,但是点完确定SCADA界面显示0&a…

神经网络 各个模块介绍(Pytorch 07)

一 网络层和块 单个神经网络(1)接受一些输入;(2)生成相应的标量输出;(3)具有一组相关 参数(parameters),更新这些参数 可以优化某目标函数。 当…

CSS3 (一)

一、CSS3 2D转换 转换(transform)是CSS3中具有颠覆性的特征之一,可以实现元素的位移、旋转、缩放等效果。转换(transform)你可以简单理解为变形。 移动:translate 、旋转:rotate 、缩放&#xf…

MATLAB 点云随机渲染赋色(51)

MATLAB 点云随机渲染赋色(51) 一、算法介绍二、算法实现1.代码2.效果总结一、算法介绍 为点云中的每个点随机赋予一种颜色,步骤和效果如图: 1、读取点云 (ply格式) 2、随机为每个点的RGB颜色字段赋值 3、保存结果 (ply格式) 二、算法实现 1.代码 代码如下(示例):…

pytest--python的一种测试框架--pycharm创建项目并进行接口请求

前言 学习request的使用,在用之前,用官方文档提供的接口:https://api.github.com/events; ctrl鼠标左键可以进入被调用函数源码,可以看到第一个参数URL是必须参数,params是选填,**kwargs是关键…

嵌入式|蓝桥杯STM32G431(HAL库开发)——CT117E学习笔记15:PWM输出

系列文章目录 嵌入式|蓝桥杯STM32G431(HAL库开发)——CT117E学习笔记01:赛事介绍与硬件平台 嵌入式|蓝桥杯STM32G431(HAL库开发)——CT117E学习笔记02:开发环境安装 嵌入式|蓝桥杯STM32G431(…

css3之2D转换transform

2D转换transform 一.移动(translate)(中间用,隔开)二.旋转(rotate)(有单位deg)1.概念2.注意点3.转换中心点(transform-origin)(中间用空格)4.一些例子(css三角和旋转) 三…

Spring Boot 使用详解

Spring Boot 使用详解 本节将详细介绍如何使用 Spring Boot。涵盖的主题包括构建系统、自动配置和如何运行应用程序。我们还将讨论一些 Spring Boot 最佳实践。尽管 Spring Boot 没有什么特别之处(它只是您可以使用的另一个库),但遵循以下一些建议会使您的开发过程更加轻松…

基于微信小程序医院挂号系统的设计与实现(论文+源码)_kaic

摘 要 进入21世纪网络和微信小程序得到了飞速发展,并和生活进行了紧密的结合。目前,网络的运行速度以达到了千兆,覆盖范围更是深入到生活中的脚脚落落。这就促使微信小程序的发展。微信小程序可以实现远程处理事务,远程提交工…

深度学习基础模型之Mamba

Mamba模型简介 问题:许多亚二次时间架构(运行时间复杂度低于O(n^2),但高于O(n)的情况)(例如线性注意力、门控卷积和循环模型以及结构化状态空间模型(SSM))已被开发出来,以解决 Transformer 在长…

mac怎么删除python

mac 默认安装了python2;自己后面又安装了python3;为了方便,现在想将python3换成Anaconda3。 Anaconda是一个开源的Python发行版本,其包含了conda、Python等180多个科学包及其依赖项。 Python3安装之后,在系统中不同目…

40个学习网站合集

1、Google:https://google.com 作为王牌浏览器,相比打开电脑就会进入谷歌浏览器,里面的谷歌搜索很好用。 在这里插入图片描述 2、CSDN— 开发者齐聚的网站:https://www.csdn.net/ CSDN不用多说,老牌专业 IT 技术社区&…

概率论经典题目-二维随机变量及分布--由概率密度求分布函数和概率

解答: 由概率密度函数求解分布函数的公式可知: 辅助图形加以确定积分上下限

酷得单片机方案 2.4G儿童遥控漂移车

电子方案开发定制,我们是专业的 东莞酷得智能单片机方案之2.4G遥控玩具童车具有以下比较有特色的特点: 1、内置充电电池:这款小车配备了可充电的电池,无需频繁更换电池,既环保又方便。充电方式可能为USB充电或者专用…

Linux 给网卡配置ip

ip addr | grep eth9 ifconfig eth9 10.0.0.2 netmask 255.255.255.0 up

Zookeeper(九)客户端的启动流程

目录 一 ZooKeeper会话的创建与连接1.1 会话的创建1.1.1 ClientWatchManager1.1.2 ConnectStringParser1.1.3 HostProvider1.1.4 ClientCnxn 1.2 会话的连接1.2.1 SendThread1.2.2 eventThread 二 ZooKeeper会话的响应2.1 接受服务端响应 三 ClientCnxn 详解3.1 Packet3.2 队列…

vue/html 集成对接 汉王esp370(标准版/谷歌版)

汉王eqp370版本介绍(所有下面的资料都在我主页文件里面) 标准版:只支持IE版本浏览器 谷歌版:支持谷歌版本浏览器 区分汉王版本的软件:已提供 如何区分版本 集成标准版方式 原理:exe的ocx组件安装后&#xf…

计算机视觉的应用27-关于VoVNetV2模型的应用场景,VoVNetV2模型结构介绍

大家好,我是微学AI,今天给大家介绍一下计算机视觉的应用27-关于VoVNetV2模型的应用场景,VoVNetV2模型结构介绍。VoVNetV2(Visual Object-Driven Representation Learning Network Version 2)是一种深度学习模型&#x…

PyQt6从入门到放弃

PyQt6从入门到放弃 安装PyQt6 pip install PyQt6# 查看QT和PyQT的版本 from PyQt6.QtCore import QT_VERSION_STR from PyQt6.QtCore import PYQT_VERSION_STR print(QT_VERSION_STR) print(PYQT_VERSION_STR)PyQt6模块 PyQt6类由一系列模块组成包括QtCore、QtGui、QtWidgets…