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

Java--乐观锁

乐观锁是一种并发控制机制,用于处理多个事务或线程对同一数据进行并发修改的问题。它假设多个事务或线程在操作数据时不会互相干扰,因此不在数据上加锁,而是在提交数据时检查数据是否被其他事务修改过。如果数据在提交前已经被其他事务修改,则当前事务需要重新读取数据并尝试再次提交。乐观锁的核心思想是“乐观地”认为数据冲突的概率很低,因此主要在提交阶段进行冲突检测。

乐观锁的实现方式

乐观锁的常见实现方式是使用版本号或时间戳:

  1. 版本号(Version Number)

    • 在数据表中增加一个版本号字段,每当数据被修改时,版本号加1。
    • 事务在读取数据时,会同时读取版本号。
    • 在更新数据时,事务会检查当前数据的版本号是否与读取时的版本号一致。如果一致,则进行更新并将版本号加1;如果不一致,则说明数据已经被其他事务修改,当前事务需要重新读取数据再进行处理。
  2. 时间戳(Timestamp)

    • 在数据表中增加一个时间戳字段,记录数据的最后修改时间。
    • 事务在读取数据时,会同时读取时间戳。
    • 在更新数据时,事务会检查当前数据的时间戳是否与读取时的时间戳一致。如果一致,则进行更新并更新时间戳;如果不一致,则说明数据已经被其他事务修改,当前事务需要重新读取数据再进行处理。

示例代码

以下是一个使用版本号实现乐观锁的示例:

数据表设计
CREATE TABLE user (id BIGINT PRIMARY KEY,name VARCHAR(50),balance DECIMAL(10, 2),version INT
);
实体类
public class User {private Long id;private String name;private BigDecimal balance;private Integer version;// Getters and Setters
}
Mapper 接口
public interface UserMapper extends BaseMapper<User> {@Update("UPDATE user SET balance = #{balance}, version = version + 1 WHERE id = #{id} AND version = #{version}")int updateUser(User user);
}
服务实现类
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {@Transactional@Overridepublic void deductBalance(Long id, BigDecimal money) {// 1.查询用户User user = getById(id);if (user == null) {throw new RuntimeException("用户不存在");}// 2.校验用户状态和余额if (user.getBalance().compareTo(money) < 0) {throw new RuntimeException("用户余额不足");}// 3.扣减余额user.setBalance(user.getBalance().subtract(money));// 4.尝试更新用户信息int updateCount = baseMapper.updateUser(user);if (updateCount == 0) {// 如果更新失败,说明版本号不一致,需要重新读取数据并重试throw new RuntimeException("更新失败,请重试");}}
}

适用场景和优缺点

适用场景

  • 适用于读多写少的应用场景,例如电商系统中的商品库存管理。
  • 适用于不希望在数据上加锁,减少锁开销,提高并发性能的场景。

优点

  • 无需加锁,减少了锁开销,提高了系统并发性能。
  • 避免了死锁的发生。

缺点

  • 在写操作频繁的场景下,重试的代价较高,可能影响性能。
  • 实现复杂度较高,需要在应用程序中额外处理冲突重试逻辑。

总结

乐观锁是一种有效的并发控制机制,通过版本号或时间戳实现冲突检测,适用于读多写少的场景,能提高系统的并发性能。在实际应用中,需要根据具体业务场景选择合适的并发控制策略。

相关文章:

Java--乐观锁

乐观锁是一种并发控制机制&#xff0c;用于处理多个事务或线程对同一数据进行并发修改的问题。它假设多个事务或线程在操作数据时不会互相干扰&#xff0c;因此不在数据上加锁&#xff0c;而是在提交数据时检查数据是否被其他事务修改过。如果数据在提交前已经被其他事务修改&a…...

静默升级oracle 11g (从11.2.0.1升级到11.2.0.4)

原文&#xff1a;https://www.cnblogs.com/daizhengyang/p/13353783.html 一个环境是oracle 11.2.0.1&#xff0c;一个环境是oracle 11.2.0.4&#xff0c;同样的数据&#xff0c;同样的sql&#xff0c;在两个版本数据库表现不一样。于是&#xff0c;干脆都统一为11.2.0.4。 但…...

什么是模型训练,如何选择合适的Batch大小

模型训练是指使用数据集对模型进行训练&#xff0c;使其能够从数据中学习到特征和模式&#xff0c;进而完成特定的任务。在深度学习领域&#xff0c;通常使用反向传播算法来训练模型&#xff0c;其中模型会根据数据集中的输入和输出&#xff0c;不断更新其参数&#xff0c;以最…...

【线上绘图网站分享】

好用的线上绘图网站分享 使用场景特点使用例子 Excalidraw 使用场景 流程图绘制、组会分享工具等&#xff1b; 特点 最重要的就是&#xff1a;免费&#xff01;&#xff01; 简单&#xff0c;快捷&#xff1a;有时候临时要画一个流程图之类的用来示意、分享知识点&#xff…...

Snipaste截图工具如何控制框线箭头的粗细程度

我们使用Snipaste截图工具的时候&#xff0c;最常用的就是框线和箭头这些功能&#xff0c;有时候感觉很粗有时候感觉太细了&#xff0c;如何解决呢&#xff1f;我们可以在使用框线或者箭头之后&#xff0c;长按1或者2来控制框线箭头的粗细程度。其中1是变细&#xff0c;2是变粗…...

GISSERVER 管理器 1.0(私有化地图离线部署)

一、 简介 QGIS现在在全世界已经成为ARCGIS的最佳代替产品,而且是开源免费的。其用户社区和产品功能都已经可以与arcgis相媲美! GISSERVER管理工具是一个零代码地图网站建站工具(私有化地图离线部署)&#xff0c;可以直接将QGIS工程转换为GIS网站&#xff08;功能类似ARCGISM…...

Eureka服务治理深度解析:服务下线与剔除机制揭秘

Eureka服务治理深度解析&#xff1a;服务下线与剔除机制揭秘 在微服务架构中&#xff0c;服务的动态注册与发现是保证系统高可用性的关键。Netflix开源的Eureka作为服务发现框架&#xff0c;其服务下线与剔除机制是确保服务列表准确性的重要手段。本文将深入探讨Eureka中的服务…...

苹果笔记本双系统怎么安装

想要在mac电脑上装双系统&#xff0c;首先需要确认您的电脑是否支持。苹果电脑自带的boot camp工具可以帮助您在mac上安装windows系统&#xff0c;只需按照步骤进行操作即可。另外&#xff0c;您也可以使用虚拟机软件&#xff0c;如parallels desktop或vmware fusion&#xff0…...

探索网络爬虫技术:原理、实践与挑战

一、引言 在数字化时代&#xff0c;信息如同潮水般汹涌而来。过去&#xff0c;我们可能依赖书籍、报纸或电视来获取信息&#xff0c;但这些渠道的信息量有限&#xff0c;而且筛选过的信息未必能满足我们的需求。如今&#xff0c;互联网为我们提供了海量的信息&#xff0c;但同…...

GitHub国内使用方法

1、登录验证&#xff1a; 在火狐中添加插件“身份验证器”。此款插件对应的主页地址为&#xff1a;https://github.com/Authenticator-Extension/Authenticator 2、加速&#xff1a; 安装工具&#xff1a;https://gitee.com/XingYuan55/FastGithub/releases/tag/2.1.4 工具…...

Java调用第三方HTTP接口的常用方式

【日常业务开发】Java调用第三方http接口的常用方式 概述Java调用第三方http接口的方式 通过JDK网络类Java.net.HttpURLConnection通过apache common封装好的HttpClient通过Apache封装好的CloseableHttpClient通过OkHttp通过Spring的RestTemplate通过hutool的HttpUtil 总结 概述…...

DOPE-PEG2000-FITC荧光特性

DOPE-PEG2000-FITC作为一种荧光标记分子&#xff0c;在生物医学领域应用。其荧光特性为生物成像和药物追踪提供了工具应用 FITC&#xff0c;作为荧光团&#xff0c;在受到特定波长的光激发时&#xff0c;能够吸收光能并转化为荧光发射。这一过程中&#xff0c;FITC分子从基态跃…...

华为Pura70支持5G功能吗?看完你就清楚了

随着 5G 技术的普及&#xff0c;现在智能手机市场中的大部分新品都已经支持 5G 网络。相较于 4G&#xff0c;5G 不仅带来了更快的网速&#xff0c;更为用户带来了全新的使用体验。 然而&#xff0c;华为作为智能手机市场的佼佼者&#xff0c;其产品线中的部分手机在配置上却有…...

android 4大组件用法

在Android开发中&#xff0c;应用程序的主要组件包括Activity、Service、Broadcast Receiver和Content Provider。这些组件共同组成了Android应用的基本构架。以下是每个组件的详细用法&#xff1a; 1. Activity Activity是Android应用的主要组成部分&#xff0c;代表一个用户…...

qt pro工程文件通用宏定义

在 Qt .pro 文件中&#xff0c;有一些预定义的宏&#xff08;或变量&#xff09;&#xff0c;它们代表了特定的路径或与项目、构建环境相关的信息。 以下是一些常用的 .pro 文件宏&#xff1a; 通用宏 $$PWD: 当前 .pro 文件所在的绝对路径。这是一个非常重要的宏&#xff0c;…...

这次让我们隆重的介绍一下

深思熟虑之后&#xff0c;我诚挚地想要全面的介绍自己。若你的需求与我的专长恰好契合&#xff0c;我将以满心的热枕和真诚与你并肩作战&#xff0c;携手解决难题&#xff0c;一同追求卓越&#xff0c;实现我们的垂直成长。我是一名经验丰富且充满热情的技术人员。我热爱编程&a…...

大语言模型系列-Transformer

DeepSeek Transformer模型是深度学习领域中一种革命性的架构&#xff0c;它在自然语言处理&#xff08;NLP&#xff09;任务中取得了巨大的成功。Transformer模型由Vaswani等人在2017年的论文《Attention Is All You Need》中提出&#xff0c;其核心思想是利用自注意力&#x…...

Node.js 语言特定指南

Node.js 语言特定指南 本 Node.js 语言特定指南将教您如何使用 Docker 容器化 Node.js 应用程序。在本指南中&#xff0c;您将学习如何&#xff1a; 容器化并运行一个 Node.js 应用程序设置一个本地环境以使用容器开发 Node.js 应用程序使用容器为 Node.js 应用程序运行测试使…...

科普:什么是 BC-404 ?全方位解读最新通缩型 NFT 标准

区块链技术飞速发展的今天&#xff0c;创新从未停歇。继 ERC-404 标准问世后&#xff0c;一个名为 BC-404 的新标准应运而生&#xff0c;为 NFT 市场带来了全新的可能性。BC-404&#xff08;Bonding Curve 404&#xff09;—基于对 ERC-404 的改进&#xff0c;加密货币中第一个…...

软件测试学习笔记丨JUnit5执行顺序

本文转自测试人社区&#xff0c;原文链接&#xff1a; https://ceshiren.com/t/topic/28025 指定顺序使用场景 测试用例有业务逻辑相关集成测试(主流程测试) 排序方式 方法排序类排序Suite官方网站没有明确说明默认排序的具体规则 方法排序的类型 方法排序-Order 注解指定排序 …...

R语言AI模型部署方案:精准离线运行详解

R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测

uniapp 中配置 配置manifest 文档&#xff1a;manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号&#xff1a;4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...

Web后端基础(基础知识)

BS架构&#xff1a;Browser/Server&#xff0c;浏览器/服务器架构模式。客户端只需要浏览器&#xff0c;应用程序的逻辑和数据都存储在服务端。 优点&#xff1a;维护方便缺点&#xff1a;体验一般 CS架构&#xff1a;Client/Server&#xff0c;客户端/服务器架构模式。需要单独…...

在 Spring Boot 中使用 JSP

jsp&#xff1f; 好多年没用了。重新整一下 还费了点时间&#xff0c;记录一下。 项目结构&#xff1a; pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...

【SpringBoot自动化部署】

SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一&#xff0c;能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时&#xff0c;需要添加Git仓库地址和凭证&#xff0c;设置构建触发器&#xff08;如GitHub…...

论文阅读:Matting by Generation

今天介绍一篇关于 matting 抠图的文章&#xff0c;抠图也算是计算机视觉里面非常经典的一个任务了。从早期的经典算法到如今的深度学习算法&#xff0c;已经有很多的工作和这个任务相关。这两年 diffusion 模型很火&#xff0c;大家又开始用 diffusion 模型做各种 CV 任务了&am…...

土建施工员考试:建筑施工技术重点知识有哪些?

《管理实务》是土建施工员考试中侧重实操应用与管理能力的科目&#xff0c;核心考查施工组织、质量安全、进度成本等现场管理要点。以下是结合考试大纲与高频考点整理的重点内容&#xff0c;附学习方向和应试技巧&#xff1a; 一、施工组织与进度管理 核心目标&#xff1a; 规…...