乐观锁 or 悲观锁 你怎么选?

news2024/11/15 11:55:36

你有没有听过这样一句话:悲观者正确,乐观者成功​。那么今天我来分享下什么是乐观锁​和悲观锁。

2c1afc4fa657c97734003819c0785be2

乐观锁和悲观锁有什么区别,它们什么场景会用

乐观锁

乐观锁基于这样的假设:多个事务在同一时间对同一数据对象进行操作的可能性很小,因此它允许多个事务同时进行,仅在事务提交时检查是否有其他事务对数据进行了修改。

特点

  • 无锁:乐观锁通常不使用数据库的锁定机制,而是通过其他方式(如时间戳、版本号)来确保数据一致性。
  • 性能:在冲突较少的情况下,乐观锁可以提供更好的性能,因为它允许高并发。
  • 冲突检测:在事务提交时检测冲突,如果检测到冲突,事务将被回滚。

实现方式

  • 版本号:在数据表中添加一个版本号字段或时间戳字段。事务开始时记录版本号,提交时检查版本号是否发生变化,如果变化了,则表示有冲突。
  • 时间戳:使用时间戳来控制事务的顺序,如果检测到时间戳冲突,则回滚事务。

适用场景

  • 写冲突较少:适用于写操作不频繁或者写冲突可能性较低的场景。
  • 读多写少:适用于读操作远多于写操作的环境。
  • 高并发:需要支持高并发访问的系统。

悲观锁

悲观锁基于这样的假设:多个事务对同一数据对象的并发操作会产生冲突,因此它在事务开始时就对数据对象加锁,直到事务结束才释放锁。

特点

  • 锁定:悲观锁通过数据库的锁定机制来确保数据一致性,如行锁或表锁。
  • 性能:在高冲突环境下,悲观锁可能导致更多的等待和锁竞争,从而影响性能。
  • 预防冲突:通过锁定机制预防冲突,而不是检测冲突。

实现方式

  • 显式锁定:使用数据库的锁定命令(如SELECT ... FOR UPDATE)来显式地锁定需要的资源。
  • 隐式锁定:通过数据库事务的隔离级别隐式地实现锁定。

适用场景

  • 写冲突较多:适用于写操作频繁或者写冲突可能性较高的场景。
  • 写多读少:适用于写操作多于读操作的环境。
  • 数据一致性要求高:需要严格保证数据一致性的场合。

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

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

相关文章

Qt图像处理技术九:得到QImage图像的灰度直方图

效果 原理 得到灰度化值&#xff0c;将灰度化的值带入0-255内&#xff0c;增加&#xff0c;得到可视化图形 源码 // 绘制直方图 QImage drawHistogram(const QImage &image) {QVector<int> histogram(256, 0);// 计算图像的灰度直方图for (int y 0; y < image…

【linux】在linux操作系统下快速熟悉开发环境并上手开发工具——体验不一样的开发之旅

个人主页&#xff1a;东洛的克莱斯韦克-CSDN博客 祝福语&#xff1a;愿你拥抱自由的风 目录 vim编辑器 Linux编译器&#xff1a;gcc/g使用 gcc和g的选项 编译过程 动静态库的链接 Linux项目的自动化构建 生成可执行程序 清理可执行程序 Linux调试器-gdb使用 git和git…

【嵌入式硬件】DRV8874电机驱动

目录 1 芯片介绍 1.1 特性简介 1.2 引脚配置 1.3 最佳运行条件 2 详细说明 2.1 PMODE配置控制模式 2.1.1 PH/EN 控制模式 2.1.2 PWM 控制模式 2.1.3 独立半桥控制模式 2.2 电流感测和调节 2.2.1 IPROPI电流感测 2.2.2 IMODE电流调节 3.应用 3.1设计要求 3.2 设计…

C# FTP/SFTP 详解及连接 FTP/SFTP 方式示例汇总

文章目录 1、FTP/SFTP基础知识FTPSFTP 2、FTP连接示例3、SFTP连接示例4、总结 在软件开发中&#xff0c;文件传输是一个常见的需求。尤其是在不同的服务器之间传输文件时&#xff0c;FTP&#xff08;文件传输协议&#xff09;和SFTP&#xff08;安全文件传输协议&#xff09;成…

Scheduling Game Event

在游戏中管理事件&#xff1a;动画更新、对象碰撞等&#xff0c;如果没有清晰的理解事件是如何被组织和执行的&#xff0c;那么这将是一项艰巨的任务。这篇精华将解释调度器如何为你的游戏框架提供组织性和灵活性。 随着电脑游戏的日益复杂&#xff0c;实时事件和模拟几乎在今…

接口测试之XML响应断言

目录 XPath 基本语法XML 响应结果解析XML 响应结果断言 XML 响应数据 如何提取 AddResult 中的值&#xff1f; <soap:Body><AddResponse xmlns"http://tempuri.org/"><AddResult>4</AddResult></AddResponse> </soap:Body> …

VB6 MQTT为什么在物联网应用中使用 MQTT 而不是 HTTP?

有需要VBA,VB6,VB.NET等方面的MQTT的可以找我 一、MQTT简介 MQTT被广泛用于物联网(IoT:Internet of Things)领域&#xff0c;其中大量的设备需要进行实时通信和数据交换。它采用了一种发布/订阅(publish/subscribe)模型&#xff0c;其中消息的发送者&#xff08;发布者&#…

CobaltStrike基本渗透

目录 CobaltStrike简介 主要功能&#xff1a; 使用注意&#xff1a; 在使用CobaltStrike进行渗透测试时&#xff0c;务必遵守法律法规&#xff0c;并获得合法授权。 CobaltStrike安装 前提 安装 服务端安装 windows安装 CS基本使用 监听器配置 一些基本的攻击…

C++/C 线性插值

插值 插值&#xff0c;是根据已知的数据序列&#xff08;可以理解为你坐标中一系列离散的点&#xff09;&#xff0c;找到其中的规律&#xff0c;然后根据找到的这个规律&#xff0c;来对其中尚未有数据记录的点 应用 对缺失的数据进行补偿对图像进行放大缩小 通用公式 如上…

小白跟做江科大32单片机之按键控制LED

原理部分 1.LED部分使用的是这样的连接方式 2.传感器模块的电路图 滤波电容如果接地&#xff0c;一般用于滤波&#xff0c;在分析电路时就不用考虑。下面这个电路就是看A端和B端哪端的拉力大&#xff0c;就能把电压值对应到相应的电压值 比较器部分 如果A端电压>B端电压&am…

【MySQL】表的连接和复合查询

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;折纸花满衣 &#x1f3e0;个人专栏&#xff1a;MySQL 目录 &#x1f449;&#x1f3fb;连接JOIN&#x1f449;&#x1f3fb;子查询&#x1f449;&#x1f3fb;合并查询 &#x1f449;&#x1f3fb;连接JOI…

【算法】位运算算法——消失的两个数字(困难)

题解&#xff1a;消失的两个数字(位运算算法) 目录 1.题目2.题解3.示例代码如下4.总结 1.题目 题目链接&#xff1a;LINK 2.题解 本题要求时间复杂度O(N),空间复杂度O(1),分别否了我们 排序遍历 和 哈希数组 的想法。想要在规定时间/空间复杂度内完成本题&#xff0c;需要借…

辅导男朋友转算法岗第1天|tokenizer

文章目录 LLM训练流程LLM中的tokenizersBPEWordPieceUnigramSentencePiece&#xff08;使用BBPE或Unigram&#xff09; LLM训练流程 【大语言模型LLM基础之Tokenizer完全介绍-哔哩哔哩】 https://b23.tv/2kdTKxf LLM中的tokenizers 三种不同分词粒度的Tokenizers word-based…

python 获取网页乱码怎么解决

在使用python爬取网页时&#xff0c;经常会遇到乱码问题&#xff0c;一旦遇到乱码问题&#xff0c;就很难得到有用的信息。本人遇到乱码问题&#xff0c;一般有以下几个方式&#xff1a; 1、查看网页源码中的head标签&#xff0c;找到编码方式&#xff0c;例如&#xff1a; 可…

【UML用户指南】-02-UML基本元素的介绍(二)

1、语法和语义规则 命名——为事物、关系和图起的名字&#xff1b; 范围——使名字具有特定含义的语境&#xff1b; 可见性——这些名字如何让其他成分看见和使用&#xff1b; 完整性——事物如何正确、一致地相互联系&#xff1b; 执行——运行或模拟一个动态模型意味着什…

安卓 Flutter Channel 源码解析

Flutter 官方提供三种 Platform 与 Dart 端消息通信方式&#xff0c;他们分别是 MethodChannel 、 BasicMessageChannel 、 EventChannel MethodChanel &#xff1a;用于传递方法调用&#xff0c; MethodCallHandler 最终必须在 UI 线程通过 result. success(x) 方法返回…

【深度学习】YOLOv10实战:20行代码将笔记本摄像头改装成目标检测监控

目录 一、引言 二、YOLOv10视觉目标检测—原理概述 2.1 什么是YOLO 2.2 YOLO的网络结构 三、YOLOv10视觉目标检测—训练推理 3.1 YOLOv10安装 3.1.1 克隆项目 3.1.2 创建conda环境 3.1.3 下载并编译依赖 3.2 YOLOv10模型推理 3.2.1 模型下载 3.2.2 WebUI推理 …

成功解决“ImportError: cannot import name ‘mapping‘ from ‘collections‘”错误的全面指南

成功解决“ImportError: cannot import name ‘mapping’ from ‘collections’”错误的全面指南 成功解决“ImportError: cannot import name ‘mapping’ from ‘collections’”错误的全面指南 一、引言 在Python编程中&#xff0c;当我们尝试从某个模块中导入某个名称时&…

上弦外媒新闻发稿:2024年度国外主流新闻媒体和海外媒体软文分发平台有哪些?

2024年度主流海外媒体新闻发稿和海外媒体软文分发平台有很多&#xff0c;下面是一些常见的和广受认可的平台&#xff1a; 主流新闻媒体 CNN - 美国知名新闻网络&#xff0c;覆盖广泛的国际新闻。BBC - 英国广播公司&#xff0c;提供全球新闻和深入报道。纽约时报 - 美国主流报…

UnityAPI学习之 事件函数(生命周期函数)的整体调用流程及细节

事件函数(生命周期函数)的整体调用流程 Reset() 这个函数会在用户首次添加该组件时或单击 Reset 按钮时被调用&#xff0c;且只在编辑器生效,可用于保存默认值 示例&#xff1a; using System.Collections; using System.Collections.Generic; using UnityEngine;public cla…