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.pswp.cn/news/387941.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/387941.shtml
英文地址,請注明出處:http://en.pswp.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;我…