activiti 为什么需要采用乐观锁?


乐观锁

为什么需要采用乐观锁?

由于activiti一个周期的transaction时间可能比较长,且同一流程实例中存在任务并发执行等场景。设计者将update、insert、delete事务性的操作推迟至command结束时完成,这样尽量降低锁冲突的概率,由此产生基于mybatis上封装的session cache来管理这些中间状态的实体对象。但在充分竞争情况下锁是不可避免的,进一步利用乐观锁机制能保证执行模型的一致性。因为往往如果锁定相同数据记录说明多个相互影响的command并发执行,安全的策略就是让第一个命令成功,其他皆失败。

PS:

悲观锁,正如其名,它指的是对数据被外界(包括本系统当前的其他事务,以及来自 外部系统的事务处理)修改持保守态度,其它事务会一直阻塞,直到这个事务结束。因此,在整个数据处理过程中,将数据处于锁定 状态。悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层提供的锁机制才能 真正保证数据访问的排他性,否则,即使在本系统中实现了加锁机制,也无法保证外部系 统不会修改数据)。

对悲观锁而言,乐观锁机制采取了更加宽松的加锁机制,不会锁住任何东西。大多是基于数据版本 ( Version )记录机制实现,更新时,对此版本号加一。此时,将提交数据的版本数据与数据库表对应记录的当前版本信息进行比对,如果提交的数据版本号大于数据库表当前版本号,则予以更新,否则认为是过期数据予以驳回。

死锁

在一个command执行过程中存在开始独立的新事务PROPAGATION_REQUIRES_NEW,例如IdGenerator,DecrementJobRetriesCmd。

1、IdGenerator:为什么不用数据库序列生成器?因为此前所说我们的数据库操作全部延迟到最后执行,故而无法使用数据库的自增序列,而是采用外部序列来联系各实体。

2、DecrementJobRetriesCmd:asynchronous job执行失败,在TransactionState.ROLLED_BACK时执行job异常登记钩子

在command中嵌入开启新subcommand(该subcommand包含需获得数据库连接资源),然而在有限资源的情况下自身已经持有资源再试图去获取同类资源是相当危险的方案,由此引发的竞争往往会将你推入死锁的深渊。正如下图所示便是activiti在高并发场景下产生死锁的原因。

deadlock

exclusive jobs

问题抛出

pall

并行execution中servicetask async=true,当他们各自被不同worker thread执行,当一个execution跑到join节点会判断是否除己之外所有的income flow都已到达,如果是则走过join否则join等待。但是当多个flow同时到达join,因为此时他们各自对于对方是不可见的,都假定对方没有到达,导致都认为要等待对方,从而导致join永远不会执行。

前面所述乐观锁在并发情况下同时只会保证第一个提交的job成功,其他抛出ActivitiOptimisticLockingException失败,从而在一定的时间后重试,但重试的次数是有限的(默认为3次),并行线路越多冲突重试的可能性也越大。且如果task service不在bpm transaction控制之下(比如POST外部系统接口),则业务不能正确回滚,被执行多次。

exclusive job 保证隶属同一process instance的job是被顺序执行,即在org.activiti.engine.impl.jobexecutor.AcquireJobsRunnable中将同一流程的job压人同一批次。

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

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

相关文章

Python实现三级菜单(字典和列表的使用)

menu { 北京: { 海淀: { 五道口: { soho: {}, 网易: {}, google: {} }, 中关村: { 爱奇艺: {}, 汽车之家: {}, 优酷: {} …

停止使用p = 0.05

How many of you use p0.05 as an absolute cut off? p ≥ 0.05 means not significant. No evidence. Nada. And then p < 0.05 great it’s significant. This is a crude way of using p-values, and hopefully I will convince you of this.你们中有多少人使用p 0.05作…

centos7系统根目录扩容

比如 点击了后 点击创建虚拟磁盘 选择一个 20G 然后启动虚拟机使用fdisk查看所有的磁盘 看是否新增了一个20G的硬盘 [rootlocalhost ~]# fdisk -l磁盘 /dev/sda&#xff1a;8589 MB, 8589934592 字节&#xff0c;16777216 个扇区 Units 扇区 of 1 * 512 512 bytes 扇区大小(…

instrumentation模拟很多activity的操作

android.app.Instrumentation好像原来是用来做测试的, 可以用来模拟很多activity的操作 主要代码如下 如果在文本框中输入24,或者25 点击按钮就能模拟音量加减键 键值可以查看android.view.KeyEvent [java] view plaincopy package com.qefee.testinstrumentation; import…

成像数据更好的展示_为什么更多的数据并不总是更好

成像数据更好的展示Over the past few years, there has been a growing consensus that the more data one has, the better the eventual analysis will be.在过去的几年中&#xff0c;越来越多的共识是&#xff0c;数据越多&#xff0c;最终的分析就越好。 However, just a…

支付宝架构

支付宝系统架构图如下&#xff1a; 支付宝架构文档有两个搞支付平台设计的人必须仔细揣摩的要点。 一个是账务处理。在记账方面&#xff0c;涉及到内外两个子系统&#xff0c;外部子系统是单边账&#xff0c;满足线上性能需求&#xff1b;内部子系统走复式记账&#xff0c;满足…

怎样可以跨进程测试

在Android系统下模拟鼠标键盘等输入设备&#xff0c;网络上资料非常多。但不少是人云亦云&#xff0c;甚至测试都不愿测试一下就抄上来了。这次写一点体会&#xff0c;当作抛砖引玉。0. 背景知识&#xff1a;众所周知&#xff0c;Android是将Framework架在Linux之上的系统。Lin…

Android Studio 导入新工程项目

1 导入之前先修改工程下相关文件 1.1 只需修改如下三个地方1.2 修改build.gradle文件 1.3 修改gradle/wrapper/gradle-wrapper.properties 1.4 修改app/build.gradle 2 导入修改后的工程 2.1 选择File|New|Import Project 2.2 选择修改后的工程 如果工程没有变成AS符号&#xf…

马蜂窝张矗:绩效考核是为了激发工作潜力,而不是逃避问题

3 月 23 日&#xff0c;由高端技术领导者社交平台 TGO 鲲鹏会主办的 GTLC 全球技术领导峰会分站首站在北京举行。会上马蜂窝技术副总裁 \u0026amp; TGO 鲲鹏会会员张矗发表了主题为“我在马蜂窝的技术管理实践”的演讲。本文根据其演讲整理而成。大家好&#xff0c;我是来自马蜂…

vue domo网站_DOMO与Tableau-逐轮

vue domo网站Let me be your BI consultant. Best yet, let me be your free consultant on the following question:让我成为您的BI顾问。 最好的是&#xff0c;让我成为您的免费顾问 &#xff0c;解决以下问题&#xff1a; DOMO vs. Tableau — What should I use?DOMO vs.…

fiddler抓包1-抓小程序https包

抓小程序包和抓app包是一样的操作方法&#xff1b;安卓用fiddler&#xff0c;ios用charles&#xff1b; 一、环境准备 1.电脑已装最新版fiddler 2.手机和电脑在同一局域网 二、fiddler设置 1.fiddler>Tools>Options>HTTPS 勾选Capture HTTPS CONNECTs 及下边的子项&am…

多态使用的前提

1&#xff1a;必须是继承&#xff08;extends&#xff09;&#xff0c;实现&#xff08;implements&#xff09; 才行2&#xff1a;必须要重写&#xff08;覆盖&#xff09;父类的方法。转载于:https://www.cnblogs.com/liyunchuan/p/10663788.html

Linux下的 FTP

1.安装vsftpd yum install vsftpd 2.启动/重启/关闭vsftpd服务器 [rootlocalhost ftp]# /sbin/service vsftpd restart Shutting down vsftpd: [ OK ] Starting vsftpd for vsftpd: [ OK ] OK表示重启成功了. 启动和关闭分别把restart改为start/stop即可. 如果是源码安装的,到…

python入门23 pymssql模块(python连接sql server增删改数据 )

增删改数据必须connect.commit()才会生效 回滚函数 connect.rollback() 连接数据库 dinghanhua sql server增删改 import pymssqlserver 192.168.1.1 user user password 111111 database testdbconnect pymssql.connect(server server,user user,passwordpassword,da…

每个人都应该使用的Python 3中被忽略的3个功能

重点 (Top highlight)Python 3 has been around for a while now, and most developers — especially those picking up programming for the first time — are already using it. But while plenty of new features came out with Python 3, it seems like a lot of them ar…

iframe自适应高度

为什么需要使用iframe自适应高度呢&#xff1f;其实就是为了美观&#xff0c;要不然iframe和窗口长短大小不一&#xff0c;看起来总是不那么舒服&#xff0c;特别是对于我们这些编程的来说&#xff0c;如鲠在喉的感觉。 首先设置样式 body{margin:0; padding:0;} 如果不设置bod…

.Net转Java自学之路—SpringMVC框架篇八(RESTful支持)

RESTful架构&#xff0c;REST即Representational State Transfer。表现层状态转换&#xff0c;就是目前最流行的一种互联网软件架构。它结构清晰、符合标准、易于理解、扩展方便&#xff0c;所以得到越来越多网站的采用。 RESTful其实就是一个开发理念&#xff0c;是对http的很…

冲刺第七天

今天任务进行情况&#xff1a;今天我们将我们的游戏导到界面形成可用的应用程序&#xff0c;并且进行调试与运行&#xff0c;让同学试玩&#xff0c;发现了困难并加以改正。 遇到的困难及解决方法&#xff1a; 运行时发现游戏界面中UI的button和image的位置会随分辨率的不同而发…

数据探查_数据科学家,开始使用探查器

数据探查Data scientists often need to write a lot of complex, slow, CPU- and I/O-heavy code — whether you’re working with large matrices, millions of rows of data, reading in data files, or web-scraping.数据科学家经常需要编写许多复杂&#xff0c;缓慢&…

Node.js Streams:你需要知道的一切

Node.js Streams&#xff1a;你需要知道的一切 图像来源 Node.js流以难以使用而闻名&#xff0c;甚至更难理解。好吧&#xff0c;我有个好消息 - 不再是这样了。 多年来&#xff0c;开发人员在那里创建了许多软件包&#xff0c;其唯一目的是简化流程。但在本文中&#xff0c;我…