长业务事务的离线并发问题
事务指代一组操作同时成功或同时失败,事务可分为两类:
- 系统事务:即关系数据库事务,一次数据库连接中由
start transaction或begin开启,commit表示提交,rollback表示回滚; - 业务事务:完成一个业务目标包含的一系列业务动作,如让一个配置生效,需要经历
编辑->保存->提交审批->审批通过这4个步骤。
当事务持续时间过长,并发请求的概率就会越大,会导致一系列并发问题,如:脏读,不可重复读,更新丢失甚至死锁等问题。
解决大系统事务的方式通常是两个思路:减少事务持续时间 和 缩小事务锁定资源的范围,比如仅在写库时开启事务,前置的查询判断逻辑不在事务中进行,以此来避免并发更新,同时写库时可使用乐观锁(如:版本号)进行兜底判断,以此来检测并发更新。
而业务事务的持续时间和资源通常由业务流程所决定,并不能在这两个方面优化来避免离线并发问题, 但可以通过乐观锁机制检测并发更新。
考虑如下场景:运营人员发布一个商品需要经过 商品配置编辑 -> 商品配置保存 -> 商品配置审批 -> 商品发布 4步,
商品配置状态机如下:

如果不做任何离线并发控制,会存在业务保存的配置和实际提交的配置存在不一致,考虑以下情况:

张三预期提交审批的配置和实际提交的配置不一致。这里需要一个版本号关联保存的配置和发起审批的配置,通常在保存时,后台返回保存的版本,后面提交审批时携带保存的版本,后台进行版本比对,如果版本不一致,则表示配置已被更新,需终止发起审批:

这种丢失更新的场景通常是由于操作非原子导致,从保存到发起审批之间的时间间隔无法预知,不同业务人员在一段时间内同时编辑容易
触发离线并发问题。
这里使用乐观锁机制在最终提交步骤里检测是否被并发更新,为什么不使用悲观锁?其一,业务流程上不允许一个业务人员的一次操作独占该配置的写,其二,悲观锁锁定时间较长,耗费资源多,且容易引发死锁问题。
那么乐观锁有什么缺点呢?业务只有在最终提交时才会感知到此次修改保存是否有效,我辛辛苦苦编辑了10分钟,最后提交你和我说被别人改了提交不了,业务很"生气"。当然也可以在业务编辑时定时检测是否有新版本提交,提早主动发现而非最后被动告知,交互性上相对更人性化,现在的各种网站也都有主动检测变更机制,例如,B站在看评论时如果有新评论会自动插入到评论区中,不需要用户重新刷新。
相关文章:
长业务事务的离线并发问题
事务指代一组操作同时成功或同时失败,事务可分为两类: 系统事务:即关系数据库事务,一次数据库连接中由start transaction或begin开启,commit表示提交,rollback表示回滚;业务事务:完…...
黑马程序员Java笔记整理(day01)
1.windowsR进入运行,输入cmd 2.环境变量 3.编写java第一步 4.使用idea 5.注释 6.字面量 7.变量 8.二进制 9.数据类型 10.关键词与标识符...
VMware Tools系列一:安装VMware Tools的作用
最近笔者安装了VMware Workstation pro 17,同时在VMware中安装了华为的Open Euler服务器,由于虚拟机Open Euler经常需要与宿主机win10交换数据,很不方便,而安装VMware Workstation pro 17并没有自动安装了VMware Tools ࿰…...
使用大语言模型(LLM)修正小段乱码(Mojibake)为正常文本
Python方案 在上一篇文章ftfy:修正小段乱码(Mojibake)为正常文本的Python库中,我介绍了ftfy这个库。但随着持续的开发,我发现它仍然有一些解决不了的转换。如下: >>> ftfy.fix_text(‡›‘…...
C++ 访问限定符
个人主页:Jason_from_China-CSDN博客 所属栏目:C系统性学习_Jason_from_China的博客-CSDN博客 所属栏目:C知识点的补充_Jason_from_China的博客-CSDN博客 概念概述 C一种实现封装的方式,用类将对象的属性与方法结合在一块…...
几种mfc140u.dll常见错误情况,以及mfc140u.dll文件修复的方法
如果你遇到与mfc140u.dll 文件相关的错误,这通常指的是该mfc140u.dll文件可能丢失、损坏或与您的应用程序不兼容。详细分析关于mfc140u.dll文件错误会对系统有什么影响,mfc140u.dll文件处于什么样的位置?以下是几种常见的错误情况及其修复方法…...
[产品管理-21]:NPDP新产品开发 - 19 - 产品设计与开发工具 - 详细设计与规格定义
目录 前言: 一、详细设计与规格定义概述 1、产品详细设计 2、规格定义 3、详细设计与规格定义的关系 4、实际应用中的注意事项 二、详细设计与规格定义主要工具 2.1 质量功能展开QFD - 需求跟踪矩阵 1、QFD的基本原理 2、QFD的实施步骤 3、QFD的优势与应…...
powershell@文件大小排序@文件夹磁盘占用分析
文章目录 abstractpowershell对于列出子目录大小的支持状况按文件大小排序指定目录下所有文件 扩展的专用函数介绍统计目录或文件的大小👺对指定目录以友好的格式列出所有文件和子目录的大小函数灵活性说明👺 综合用例其他相关软件易用系列 abstract 在…...
详解c++多态---上
virtual关键字 1.可以修饰原函数,为了完成虚函数的重写,满足多态的条件之一。 class Person { public:virtual void BuyTicket() { cout << "买票-全价" << endl; } };class Student : public Person { public:virtual void Buy…...
emWin5的图片半透明之旅
文章目录 目标过程直接使用png (失败了)通过 BmpCvt.exe 转换一下(成功了)通过bmp转 (半成功吧) 补充工程结构整理 目标 显示半透明效果,类似png那种,能透过去,看到背景。 过程 直接使用png …...
【RabbitMQ 项目】项目概述
项目概述 一.角色划分二.服务器模块概述1.本地模块2.网络模块3.服务器模块 三.模块详细划分1.服务端2.客户端 一.角色划分 该项目的模型是一个跨主机的生产消费模型,有三种角色:生产者,消费者,中间人。对应就要实现三个大模块&…...
【VSCode】VSCode Background 背景插件辅助窗口程序
前排贴上Github项目链接 GitHub窗口项目链接 这是一个基于VSCode上由shalldie上传的background扩展制作的windows窗口程序。 该程序旨在通过窗口程序尽可能的完善该扩展原有的功能。 background - shalldie 的最大优势是我目前仅在其扩展上发现了UseFront的选项,这…...
gdb 前端:kdbg 安装使用
文章目录 1. 前言2. kdbg 安装使用2.1 安装 kdbg2.2 使用 kdbg 1. 前言 限于作者能力水平,本文可能存在谬误,因此而给读者带来的损失,作者不做任何承诺。 2. kdbg 安装使用 2.1 安装 kdbg kdbg 是 gdb 的图形化界面的前端,在 …...
UDP_SOCKET编程实现
文章目录 socket编程接口认识struct sockaddr类 编写一个server服务Client代码查看启动结果代码修正1.获取内核分配给客户端的信息2.修正不匹配ip不能访问的问题 不同机器之间的通信利用xftp将udp_client传给wsl的ubuntu机器进行演示现在模拟在windows下的udp_client代码: 对方…...
【网络】高级IO——阻塞IO和非阻塞IO的实现
目录 一.文件描述符的默认行为——阻塞IO 二.非阻塞IO 2.1.在打开文件或创建套接字时设置非阻塞模式: 2.2.在使用网络I/O接口时请求非阻塞行为: 2.3.fcntl函数 一.文件描述符的默认行为——阻塞IO 在Linux系统中,无论是通过open系统调用…...
ASPICE培训:打造卓越的汽车软件开发能力
随着汽车行业的快速发展和智能化技术的不断演进,汽车软件开发已成为汽车制造过程中不可或缺的一部分。为了确保汽车软件的质量、可靠性和安全性,ASPICE(Automotive SPICE)作为一种国际公认的汽车软件开发过程评估标准,…...
基于Python的人工智能应用案例系列(2):分类
在本篇文章中,我们将探讨分类问题,具体的应用场景是贷款审批预测。通过该案例,我们将学习如何使用Python处理分类问题,训练模型并预测贷款是否会被批准。 案例背景 该数据集包含贷款申请的相关信息,目标是预测贷款是否…...
演示:基于WPF自绘的中国省份、城市、区县矢量地图
一、目的:演示一个基于WPF自绘的中国省份、城市、区县矢量地图 二、效果 国 省 市 三、功能 支持实际经纬度显示 支持平移,缩放等功能 显示中国地图 显示各个省份地图 显示各个省份地图(包含在表格中,包含缩率图) 显…...
同时拥有独显和核显,怎么让应用程序选择使用哪个GPU?
看你现在使用的是核显还是独显 勾选上GPU引擎选项,后面便会标识你所使用的是哪种显卡,如果是独立显卡,就可以免去后续的操作;如果不是,那么请继续接下来的操作。 将你需要使用独显的程序换成gpu1(独显&am…...
C++八股文之面向对象篇
🤖个人主页:晚风相伴-CSDN博客 思维导图链接:面向对象的性质 持续更新中…… 💖如果觉得内容对你有帮助的话,还请给博主一键三连(点赞💜、收藏🧡、关注💚)吧 …...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...
Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...
STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...
12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...
