camunda流程引擎事务管理和乐观锁

news2025/2/25 3:24:55

本文重点介绍camunda开源流程引擎的事务配置,以及在高并发多线程情况下,可能会发生多个线程尝试对相同流程实例数据进行更改的情况Camunda如何通过数据库的乐观锁解决这种并发冲突的,并介绍了乐观锁和悲观锁的适用场景、性能影响等。

1、camunda流程引擎事务配置

camunda流程引擎可以配置为与事务管理器(或事务管理系统)集成。该流程引擎开箱即用,支持与 Spring 和 JTA 事务管理集成。

如果你使用的是springboot框架,事务的配置更加简单,只需要配置:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

Spring Boot 为我们提供了默认的事务管理器,当我们使用了 spring-boot-starter-jdbc 的启动器时,框架会自动注入 DataSourceTransactionManager 管理器。只需要在启动类上使用@EnableTransactionManagement注解来开启注解事务,即可不需要任何额外配置就可以用 @Transactional 注解进行事务的使用。但是当我们自己配置了事务管理器的时候,Spring Boot 将不再提供事务管理,而是使用我们定义的事务管理器。

1.1、事务和流程引擎上下文

当执行流程引擎命令时,引擎将创建流程引擎上下文。Context 会缓存数据库实体,因此对同一实体的多个操作不会导致多次数据库查询。这也意味着对这些实体的更改会被累积,并在命令返回后立即刷新到数据库。但需要注意的是,当前事务可能会在稍后时间提交。

如果一个流程引擎命令嵌套在另一个命令中,即一个命令在另一个命令中执行,则默认行为是重用现有的流程引擎上下文。这意味着嵌套命令将有权访问相同的缓存实体以及对它们所做的更改。

当嵌套的Command要在新的事务中执行时,需要创建一个新的流程引擎上下文来执行它。在这种情况下,嵌套命令将为数据库实体使用新的缓存,独立于先前(外部)命令缓存。这意味着,一个命令的缓存中的更改对另一个命令不可见,反之亦然。当嵌套命令返回时,更改将独立于外部命令的流程引擎上下文而刷新到数据库。

3、乐观锁

Camunda 引擎可用于多线程应用程序。在这样的设置中,当多个线程同时与流程引擎交互时,可能会发生这些线程尝试对相同数据进行更改的情况。例如:两个线程尝试同时(并发)完成相同的用户任务。这样的情况就是冲突:任务只能完成一次。

Camunda 引擎使用一种名为“乐观锁定”(或乐观并发控制)的众所周知的技术来检测和解决此类情况。

本节分为两部分:第一部分介绍乐观锁的概念。第二部分解释了Camunda中乐观锁的用法。

3.1、什么是乐观锁?

乐观锁定(也称为乐观并发控制)是一种并发控制方法,用于基于事务的系统。在数据读取频率高于更改频率的情况下,乐观锁定最为有效。许多线程可以同时读取相同的数据对象,而不会相互排斥。然后,通过检测冲突并防止在多个线程尝试同时更改相同数据对象的情况下进行更新来确保一致性。如果检测到此类冲突,则可以确保只有一个更新成功,而所有其他更新都会失败。

举例说明:假设我们有一个包含以下条目的数据库表:

ID

版本

姓名

地址

……

8

1

史蒂夫

令牌城Workflow大道3号

……

……

……

……

……

……

上表显示单行保存用户数据。用户拥有唯一的 ID(主键)、版本、名称和当前地址。

我们现在构建一种情况,其中有 2 个事务尝试更新此条目,一个事务尝试更改地址,另一个事务尝试删除用户。预期的行为是,一旦一个事务成功,另一个事务就会中止,并出现错误,表明检测到并发冲突。然后,用户可以根据数据的最新状态决定重试交易:

如上图所示,Transaction 1读取用户数据,对数据执行某些操作,删除用户,然后提交。 Transaction 2同时启动并读取相同的用户数据,并且也对数据进行操作。当Transaction 2尝试更新用户地址时,检测到冲突(因为Transaction 1已经删除了用户)。

检测到冲突是因为Transaction 2执行更新时读取用户数据的当前状态。此时并发Transaction 1已经标记了要删除的行。数据库现在等待Transaction 1结束。结束后Transaction 2即可继续。此时,该行不再存在,更新成功,但报告已更改0行。应用程序可以对此做出反应并回滚,Transaction 2以防止该事务所做的其他更改生效。

应用程序(或使用它的用户)可以进一步决定是否Transaction 2应该重试。在我们的示例中,交易将找不到用户数据并报告用户已被删除。

乐观锁与悲观锁

悲观锁与读锁一起使用。读锁会在读取时锁定数据对象,从而防止其他并发事务也读取该数据对象。这样,就可以避免冲突的发生。

在上面的示例中,Transaction 1一旦读取用户数据就会锁定它。当尝试阅读时,也会Transaction 2被阻碍而无法取得进展。完成后Transaction 1Transaction 2可以继续并读取最新状态。这样可以防止冲突,因为事务始终只针对最新的数据状态进行工作。

在写入与读取一样频繁且竞争激烈的情况下,悲观锁定非常有效。

但是,由于悲观锁是独占的,因此并发性会降低,从而降低性能。因此,乐观锁定检测冲突而不是阻止冲突发生,因此在高并发级别以及读取比写入更频繁的情况下更可取。此外,悲观锁会很快导致死锁。

3.2、Camunda 中的乐观锁

Camunda 使用乐观锁进行并发控制。如果检测到并发冲突,则会引发异常并回滚事务。执行UPDATEDELETE语句时会检测到冲突。执行删除或更新语句会返回受影响的行数。如果该计数等于 0,则表明该行之前已被更新或删除。在这种情况下,会检测到冲突并OptimisticLockingException引发冲突。

3.2.1、Camunda 实现乐观锁的细节

大多数 Camunda Engine 数据库表都包含一个名为 的列REV_。此列代表修订版本。读取一行时,会按给定的“修订版”读取数据。修改(更新和删除)始终尝试更新当前命令读取的修订版本。更新增加修订版。执行修改语句后,将检查受影响的行数。如果计数为,1则推断执行修改时读取的版本仍然是当前版本。如果受影响的行数为0,则其他事务在该事务运行时修改了相同的数据。这意味着检测到并发冲突,并且不得允许该事务提交。随后,事务被回滚(或标记为仅回滚)并且OptimisticLockingException被抛出。

3.2.2、乐观锁定异常

可以OptimisticLockingException通过 API 方法抛出。考虑该completeTask(...)方法的以下调用:

taskService.completeTask(aTaskId); // may throw OptimisticLockingException

OptimisticLockingException如果执行方法调用导致数据并发修改,则上述方法可能会抛出异常。

作业执行也可能导致OptimisticLockingException抛出异常。由于这是预期的,因此将重试执行。

3.2.3、处理乐观锁异常

如果当前命令由作业执行器触发,OptimisticLockingException则会使用重试自动处理。由于预计会发生此异常,因此它不会减少重试计数。

如果当前Command是由外部API调用触发的,Camunda引擎会将当前事务回滚到最后一个保存点(等待状态)。现在用户必须决定如何处理异常,是否应该重试事务。还要考虑到,即使事务被回滚,它也可能具有尚未回滚的非事务副作用。

为了控制事务的范围,可以使用异步延续在活动之前和之后添加显式保存点。

3.2.4、引发乐观锁异常的常见位置

有一些常见的地方OptimisticLockingException可以扔。例如

  • 竞争性外部请求:同时完成同一任务两次。
  • 进程内的同步点:例如并行网关、多实例等。

以下模型显示了可以发生这种情况的并行网关OptimisticLockingException

打开并行网关后有两个用户任务。在用户执行任务之后,关闭并行网关将执行合并为一个。在大多数情况下,其中一项用户任务将首先完成。然后,执行等待正在关闭的并行网关,直到第二个用户任务完成。

然而,两个用户任务也有可能同时完成。假设上面的用户任务已经完成。该交易假设他是第一个关闭并行网关的人。下面的用户任务是并发完成的,并且事务还假设他是关闭并行网关上的第一个。两个事务都尝试更新一行,这表明它们是正在关闭的并行网关上的第一个事务。在这种情况下,OptimisticLockingException会抛出一个异常。其中一个事务已回滚,另一个事务成功更新该行。

3.2.5、乐观锁定和非事务副作用

发生后OptimisticLockingException,事务将回滚。任何事务性工作都将被撤消。非事务性工作(例如创建文件或调用非事务性 Web 服务的效果)将无法撤消。这可能会导致不一致的状态。

此问题有多种解决方案,最常见的解决方案是使用重试进行最终整合。

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

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

相关文章

MySQL数据库概念及安装

一、数据库的基本概率 1.1 数据 记录每个人的信息 或者记录数据 1.2 表 存放信息的集合 或者存放行和列的信息 1.3 数据库 表的集合 二、数据库管理系统&#xff08;DBMS&#xff09; 2.1 DBMS定义 &#xff08;DBMS&#xff09;是一种软件&#xff0c;用于创建和管理…

【Python脚本随手笔记】 --- 复制文件并修改权限

&#x1f48c; 所属专栏&#xff1a;【Python脚本随手笔记】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#…

HarmonyOS 通知意图

之前的文章 我们讲了 harmonyos 中的 基础和进度条通知 那么 今天 我们来说说 任何给通知添加意图 通知意图 简单说 就是 当我们点击某个通知 如下图 然后 就会拉起某个 应用 就例如说 我们某个微信好友发消息给我们 我们 点击系统通知 可以直接跳到你们的聊天界面 好 回到…

Vue+SpringBoot打造民宿预定管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用例设计2.2 功能设计2.2.1 租客角色2.2.2 房主角色2.2.3 系统管理员角色 三、系统展示四、核心代码4.1 查询民宿4.2 新增民宿4.3 新增民宿评价4.4 查询留言4.5 新增民宿订单 五、免责说明 一、摘要 1.1 项目介绍 基于…

VsCode中高效书写Vue3代码的插件

Vue-Official&#xff08;原Volar&#xff09; 就是原先的Volar&#xff0c;现已弃用。 Vue-Official 提供的功能&#xff1a; 语法高亮: Vue-Official 扩展可以为 Vue 单文件组件&#xff08;.vue 文件&#xff09;中的 HTML、CSS 和 JavaScript 部分提供语法高亮&#xff…

linux系统------------Mysql数据库

目录 一、数据库基本概念 1.1数据(Data) 1.2表 1.3数据库 1.4数据库管理系统(DBMS) 数据库管理系统DBMS原理 1.5数据库系统&#xff08;DBS) 二、数据库发展史 1、第一代数据库 2、第二代数据库 3、第三代数据库 三、关系型数据库 3.1关系型数据库应用 3.2主流的…

Echo服务器学习__01(基础)

ASIO是一个跨平台&#xff0c;主要用于实现异步网络和其他一些底层I/O操作的C库 可以基于ASIO实现Echo服务端&#xff0c;在这之前&#xff0c;学习一些基础的知识和概念 ​ 1&#xff1a;IO多路复用 简单的来说&#xff0c;一个线程同时监听多个I/O事件就是I/O多路复用。任…

⭐北邮复试刷题1793. 好子数组的最大分数___(基于快排的划分思想/基于快排的划分思想的优化过程/基于贪心的双指针操作)__每日一题

Problem: 1793. 好子数组的最大分数 文章目录 思路Code: 思路 法一: 基于快排的划分思想 1.即开始为拿到数组全部 计算分数 后来对每次找到的min值的下标左右两侧进行划分 即将min去掉 从而可以构建出两个新数组; 2.对新数组继续计算分数 与前一次比较取最大 接着继续找到min值…

51、CR-GCN:EEG通道拓扑结构+脑功能连接捕获EEG通道关系,用于情感识别[我处理的是原始EEG数据哦]

文章&#xff1a; CR-GCN: Channel-Relationships-Based Graph Convolutional Network for EEG Emotion Recognition 单位&#xff1a; 上海大学计算机学院、上海工业计算机、喀什大学计算机学院。提出CR-GCN&#xff0c;使用GCN的邻接矩阵提取情感数据中的特征用于分类。 2…

云计算太卷了,腾讯云服务器一年61元起,2核2G3M配置

腾讯云服务器多少钱一年&#xff1f;61元一年起。2024年最新腾讯云服务器优惠价格表&#xff0c;腾讯云轻量2核2G3M服务器61元一年、2核2G4M服务器99元一年可买三年、2核4G5M服务器165元一年、3年756元、轻量4核8M12M服务器646元15个月、4核16G10M配置32元1个月、312元一年、8核…

Flutter开发入门——路由

什么是路由&#xff1f; 移动端应用开发中&#xff0c;路由技术是一个非常重要的组成部分。路由技术负责管理应用中各个页面之间的跳转、导航以及参数传递等关键功能。在移动端应用中&#xff0c;一个高效、易于维护的路由系统对于提高开发效率和用户体验具有重要意义。 Flut…

AndroidLinux GPIO控制方法

目录 1 GPIO整体架构 2 user space 层 gpio使用方法 2.1 sysfs控制方法 2.1.1 kernel版本区别 2.1.2 /sys/class/gpio 2.1.3 /sys/bug/gpio/devices 2.2 chardev控制方法 2.2.1 chardev 示例代码 2.2.2 示例代码主要步骤描述 2.2.3 include/linux/gpio.h 全部代码 2.3…

代码随想录算法训练营第四十三天|卡码网52. 携带研究材料(第七期模拟笔试)、518. 零钱兑换 II、377. 组合总和 Ⅳ

卡码网52. 携带研究材料&#xff08;第七期模拟笔试&#xff09; 刷题https://kamacoder.com/problempage.php?pid1052文章讲解https://programmercarl.com/%E8%83%8C%E5%8C%85%E9%97%AE%E9%A2%98%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80%E5%AE%8C%E5%85%A8%E8%83%8C%E5%8C%85.…

STM32通信协议

STM32通信协议 STM32通信协议 STM32通信协议一、通信相关概念二、通信协议引脚作用三、通信方式四、采样方式五、电平信号六、通信对象 一、通信相关概念 通信接口 通信的目的&#xff1a;将一个设备的数据传送到另一个设备&#xff0c;扩展硬件系统 通信协议&#xff1a;制定…

sqlserver字段2按字段1分组后;合并字段2

效果 相同dzbm的mc通过‘;’合并 sqlserver语句 按字段dzbm分组,有相同dzbm的mc通过 ;合并成一个字段,其它字段都选择第一个 SELECT dzbm, STUFF((SELECT DISTINCT ; + mc FROM tablenameWHERE dzbm = p.dzbm FOR XML PATH()), 1

Json Web Token(JWT) 快速入门

推荐视频&#xff1a;【从零开始掌握JWT】 目录 第一章 会话跟踪 01 使用Cookie和Session&#xff0c;jsessionid 02 使用token 例子一&#xff1a;自定义token 例子二&#xff1a;使用redis存储token 第一章 会话跟踪 应用背景 &#xff1a;浏览器访问web应用&#xff…

Linux工具 - 强大的vim编辑器

~~~~ 前言vim是什么为什么有vimvim怎么用vim模式介绍模式切换命令模式(Normal mode)i/a/o 切换到插入模式: 切换到底行模式R 切换到替换模式光标移动删除文字复制撤销更改 插入模式(Insert mode)底行模式(last line mode)&#xff08;需整理20240311&#xff09;替换模式vim简单…

STP环路避免实验(思科)

华为设备参考&#xff1a;STP环路避免实验&#xff08;华为&#xff09; 一&#xff0c;技术简介 Spanning Tree Protocol&#xff08;STP&#xff09;&#xff0c;即生成树协议&#xff0c;是一种数据链路层协议。主要作用是防止二层环路&#xff0c;并自适应网络变化和故障…

大势智慧与云世纪签署战略合作,实景三维赋能低空经济,泛测绘助力城市数据更新更高效

2024年《政府工作报告》提出“要大力推进现代化产业体系建设&#xff0c;加快发展新质生产力”、“积极打造商业航天、低空经济等新增长引擎”。 近日&#xff0c;武汉大势智慧科技有限公司&#xff08;以下简称“大势智慧”&#xff09;和青岛云世纪信息科技有限公司&#xf…

Portraiture2024中文版PS/LR专用智能磨皮插件

打造完美肤质&#xff0c;Portraiture PS/LR专用智能磨皮插件让你的照片焕发魅力 副标题&#xff1a;让你的照片告别粗糙皮肤和毛孔&#xff0c;展现自然细腻的肤质 在摄影后期处理中&#xff0c;给照片进行磨皮和肤质优化是一项必不可少的步骤。 而今天&#xff0c;我们为你带…