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

乐观锁和悲观锁有什么区别,它们什么场景会用
乐观锁
乐观锁基于这样的假设:多个事务在同一时间对同一数据对象进行操作的可能性很小,因此它允许多个事务同时进行,仅在事务提交时检查是否有其他事务对数据进行了修改。
特点:
- 无锁:乐观锁通常不使用数据库的锁定机制,而是通过其他方式(如时间戳、版本号)来确保数据一致性。
- 性能:在冲突较少的情况下,乐观锁可以提供更好的性能,因为它允许高并发。
- 冲突检测:在事务提交时检测冲突,如果检测到冲突,事务将被回滚。
实现方式:
- 版本号:在数据表中添加一个版本号字段或时间戳字段。事务开始时记录版本号,提交时检查版本号是否发生变化,如果变化了,则表示有冲突。
- 时间戳:使用时间戳来控制事务的顺序,如果检测到时间戳冲突,则回滚事务。
适用场景:
- 写冲突较少:适用于写操作不频繁或者写冲突可能性较低的场景。
- 读多写少:适用于读操作远多于写操作的环境。
- 高并发:需要支持高并发访问的系统。
悲观锁
悲观锁基于这样的假设:多个事务对同一数据对象的并发操作会产生冲突,因此它在事务开始时就对数据对象加锁,直到事务结束才释放锁。
特点:
- 锁定:悲观锁通过数据库的锁定机制来确保数据一致性,如行锁或表锁。
- 性能:在高冲突环境下,悲观锁可能导致更多的等待和锁竞争,从而影响性能。
- 预防冲突:通过锁定机制预防冲突,而不是检测冲突。
实现方式:
- 显式锁定:使用数据库的锁定命令(如
SELECT ... FOR UPDATE)来显式地锁定需要的资源。 - 隐式锁定:通过数据库事务的隔离级别隐式地实现锁定。
适用场景:
- 写冲突较多:适用于写操作频繁或者写冲突可能性较高的场景。
- 写多读少:适用于写操作多于读操作的环境。
- 数据一致性要求高:需要严格保证数据一致性的场合。
相关文章:
乐观锁 or 悲观锁 你怎么选?
你有没有听过这样一句话:悲观者正确,乐观者成功。那么今天我来分享下什么是乐观锁和悲观锁。 乐观锁和悲观锁有什么区别,它们什么场景会用 乐观锁 乐观锁基于这样的假设:多个事务在同一时间对同一数据对象进行操作的可能性很…...
《庆余年算法番外篇》:范闲通过最短路径算法在阻止黑骑截杀林相
剧情背景 在《庆余年 2》22集中,林相跟大宝交代完为人处世的人生哲理之后,就要跟大宝告别了 在《庆余年 2》23集中,林相在告老还乡的路上与婉儿和大宝告别后 范闲也在与婉儿的对话中知道黑骑调动是绝密,并把最近一次告老还乡梅…...
大一C语言课设 服装销售系统 代码实现与项目总结
问题分析 服装信息管理及销售管理系统。方便对库存服装的信息管理和添加新服装数据,同时兼具库存数量管理功能。 功能实现 1、建立服装信息库,包括:服装代码、型号、规格、面料、颜色、单价、数量; 2、建立销售信息库ÿ…...
从新手到专家:深入探索JVM垃圾回收--开端篇
引言: 在Java的世界里,垃圾回收(Garbage Collection, GC)机制扮演着至关重要的角色,它决定了Java应用的性能、稳定性和扩展性。本系列文章旨在深入探讨JVM中的垃圾回收技术,从基础的概念讲起,直…...
R可视化:另类的柱状图
介绍 方格状态的柱状图 加载R包 knitr::opts_chunk$set(echo TRUE, message FALSE, warning FALSE) library(patternplot) library(png) library(ggplot2) library(gridExtra)rm(list ls()) options(stringsAsFactors F)导入数据 data <- read.csv(system.file(&qu…...
Docker的数据管理(数据卷+数据卷容器)
文章目录 一、Docker的数据管理1、概述2、主要的技术(三种数据挂载方式)2.1、数据卷(Volumes)2.2、绑定挂载(Bind mounts)2.3、tmpfs挂载(Tmpfs mounts)2.4、之间的关系(…...
字符串-至多包含K种字符的子串中最长子串(mid)
一、题目描述 二、解题思路 借鉴以下题目思想,使用双指针,外层循环右侧指针移动,内存循环左侧指针移动 字符串-最长不含重复字符的子字符串(mid)-CSDN博客文章浏览阅读622次,点赞17次,收藏4次。java刷题:…...
Docker从安装开始精通
从虚拟机到容器 1.环境配置的难题 软件开发最大的麻烦事之一,就是环境配置。用户计算机的环境都不相同,你怎么知道自家的软件,能在那些机器跑起来? 用户必须保证两件事:操作系统的设置,各种库和组件的安装…...
MFC:初步理解序列化与反序列化(含代码实现)
序列化与反序列化是MFC将对象数据以二进制数据流的形式进行存储和读取的机制,读、写的效率很高。通过序列化与反序列化,可以将程序中对象在内存中数据保存到文件 (磁盘) 或者从文件 (磁盘) 中读取到内存以恢复对象数据,从而实现程序对数据的持…...
python程序控制结构
文章目录 一、python程序控制结构介绍二、顺序结构2.1、print()函数2.2、end参数2.3、input()函数 三、选择结构3.1选择结构的用途 四、循环结构4.1循环结构的构造4.1.1、循环结构的三个要素4.1.2、循环结构的一个要求4.1.3、循环结构的一个关系 4.2、循环语句4.2.1、while语句…...
【GD32】04 - Timer定时器
GD32中的定时器 GD32E230中有七个定时器,六种类型,其中通用的L4版本有两个,其他类型的各一个。 那我们就以通用L4这个类型来敲代码,其他流程是通用的。 通用L4 虽然每种类型的定时器都有自己的结构框图,但是其实大差…...
Golang | Leetcode Golang题解之第123题买卖股票的最佳时机III
题目: 题解: func maxProfit(prices []int) int {buy1, sell1 : -prices[0], 0buy2, sell2 : -prices[0], 0for i : 1; i < len(prices); i {buy1 max(buy1, -prices[i])sell1 max(sell1, buy1prices[i])buy2 max(buy2, sell1-prices[i])sell2 m…...
Leetcode2028. 找出缺失的观测数据
Every day a Leetcode 题目来源:2028. 找出缺失的观测数据 解法1:模拟 统计当前 m 个元素的总和 curSum sum(rolls),总共 mn 个元素和为 total (m n) * mean。 排除 2 种情况: total - curSum > 6 * n:n 个…...
如何在CentOS中合理划分磁盘空间以优化系统性能
目录 前言 理想的分区方案 为什么需要单独分区 安全性 性能 管理和维护 稳定性和可靠性 升级和兼容性 结论 前言 在进行CentOS系统的安装和配置时,合理划分磁盘空间是确保系统性能、安全性和易于管理的关键步骤。本文将探讨如何根据系统的硬件配置和预期用途…...
算法(十一)贪婪算法
文章目录 算法简介算法概念算法举例 经典问题 -背包问题 算法简介 算法概念 贪婪算法(Greedy)是一种在每一步都采取当前状态下最好的或者最优的选择,从而希望导致结果也是全局最好或者最优的算法。贪婪算法是当下局部的最优判断,…...
Rust之函数式语言特性:迭代器和闭包(一):概述
开发环境 Windows 11Rust 1.78.0 VS Code 1.89.1 项目工程 这次创建了新的工程minigrep. 函数式语言特性:迭代器和闭包 Rust的设计从许多现有语言和技术中获得了灵感,其中一个重要影响是函数式编程。函数式编程通常包括通过在参数中传递函数、从其他函数返回函数、…...
配置资源管理
一 Secret Secret 是用来保存密码、token、密钥等敏感数据的 k8s 资源,这类数据虽然也可以存放在 Pod 或者镜像中,但是放在 Secret 中是为了更方便的控制如何使用数据,并减少暴露的风险。 1 有三种类型: kubernetes.io/service…...
unity2020打包webGL时卡进程问题
我使用的2020.3.0f1c1,打包发布WEB版的时候会一直卡到asm2wasm.exe这个进程里,而且CPU占用率90%以上。 即使是打包一个新建项目的空场景也是同样的问题,我尝试过一直卡在这里会如何,结果还真打包成功了。只是打包一个空场景需要20…...
云原生架构相关技术_3.无服务器技术
1.技术特点 1.1面向特定领域的后端云服务(BaaS) 随着以Kubernetes为代表的云原生技术成为云计算的容器界面,Kubernetes成为云计算的新一代操作系统。面向特定领域的后端云服务(BaaS)则是这个操作系统上的服务API&…...
Leetcode:Z 字形变换
题目链接:6. Z 字形变换 - 力扣(LeetCode) 普通版本(二维矩阵的直接读写) 解决办法:直接依据题目要求新建并填写一个二维数组,最后再将该二维数组中的有效字符按从左到右、从上到下的顺序读取并…...
为 Claude Code 配置 Taotoken 以解决访问不稳定与 Token 不足问题
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 为 Claude Code 配置 Taotoken 以解决访问不稳定与 Token 不足问题 Claude Code 作为一款强大的编程助手,其原生服务有…...
用操作系统类比彻底搞懂 AI Agent:进程、系统调用与上下文窗口
用操作系统类比彻底搞懂 AI Agent:进程、系统调用与上下文窗口 引言 很多人第一次接触 AI Agent,会立刻被一堆新词包围:Tool Use、Function Calling、RAG、Memory、Orchestrator、Multi-Agent、Context Compression。 这些词看起来很新&#…...
避开无感FOC的那些坑:我的STM32F103 SMO观测器调试心得与波形分析
避开无感FOC的那些坑:我的STM32F103 SMO观测器调试心得与波形分析 在无感FOC驱动开发中,观测器的调试往往是整个项目中最具挑战性的环节。当电机出现抖动、观测角度不准或启动失败时,如何快速定位问题并优化参数,成为工程师们必须…...
Android跨平台文件同步技术实现:WebDAV桥接工具架构深度解析
Android跨平台文件同步技术实现:WebDAV桥接工具架构深度解析 【免费下载链接】webdav-provider An Android app that can expose WebDAV storage to other apps through Androids Storage Access Framework (SAF) 项目地址: https://gitcode.com/gh_mirrors/we/we…...
多模态大模型应用开发利器:xBrain工具箱核心解析与实战
1. 项目概述:一个面向多模态大模型的开源工具箱 最近在折腾大模型应用开发,特别是涉及到图像、文本、音频等多模态任务时,常常感到工具链的割裂。文本生成有成熟的框架,视觉任务又有另一套生态,想把它们高效地整合到一…...
深入解析 magic-cli:基于模板的自动化代码生成工具设计与实践
1. 项目概述:一个能“变魔术”的命令行工具最近在折腾一些自动化脚本和项目脚手架时,发现了一个挺有意思的开源项目,叫magic-cli。乍一看这个名字,你可能会觉得有点玄乎,命令行工具还能玩出什么“魔法”来?…...
华硕笔记本终极优化神器:GHelper完整使用教程
华硕笔记本终极优化神器:GHelper完整使用教程 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivobook, Zenbook, Expertbook…...
突破性能瓶颈:Photoshop图层批量导出工具的架构解析与工作流优化
突破性能瓶颈:Photoshop图层批量导出工具的架构解析与工作流优化 【免费下载链接】Photoshop-Export-Layers-to-Files-Fast This script allows you to export your layers as individual files at a speed much faster than the built-in script from Adobe. 项目…...
基于MCP协议连接AI与Postal邮件服务器的自动化实践
1. 项目概述:一个连接Postal与MCP的桥梁最近在折腾一些自动化工作流,发现很多内部系统的数据都通过Postal(一个开源的邮件服务器管理平台)来流转,而我又想用上新兴的模型上下文协议(MCP)来让AI助…...
揭秘macOS独立滚动控制:Scroll Reverser如何巧妙解决输入设备冲突
揭秘macOS独立滚动控制:Scroll Reverser如何巧妙解决输入设备冲突 【免费下载链接】Scroll-Reverser Per-device scrolling prefs on macOS. 项目地址: https://gitcode.com/gh_mirrors/sc/Scroll-Reverser 你是否曾经为macOS系统的滚动方向设置感到困扰&…...
