摘要:鎖業(yè)務(wù)場(chǎng)景針對(duì)一個(gè)賠付工單由底下小二發(fā)起當(dāng)金額數(shù)量大于一定值以后針對(duì)這筆工單就會(huì)有層層審批風(fēng)控先一個(gè)審批流審批主管審批財(cái)務(wù)審批這里就會(huì)存在種權(quán)限一審權(quán)限二審權(quán)限終審權(quán)限當(dāng)這筆工單被小二提交以后就會(huì)給小二對(duì)應(yīng)的創(chuàng)建一個(gè)審批任務(wù)在主
鎖 業(yè)務(wù)場(chǎng)景
針對(duì)一個(gè)賠付工單(由底下小二發(fā)起),當(dāng)金額數(shù)量大于一定值以后,針對(duì)這筆工單就會(huì)有層層審批(風(fēng)控),先YY一個(gè)審批流「TL審批」--->「主管審批」--->「財(cái)務(wù)審批」.這里就會(huì)存在3種權(quán)限「一審權(quán)限」「二審權(quán)限」「終審權(quán)限」,當(dāng)這筆工單被小二提交以后就會(huì)給小二對(duì)應(yīng)的TL創(chuàng)建一個(gè)審批任務(wù),在主管的界面就可以看到相應(yīng)的審批任務(wù),主管可以點(diǎn)擊通過(guò)或者拒絕
實(shí)現(xiàn)1.查詢?nèi)蝿?wù),判斷當(dāng)前角色是否有權(quán)限操作該筆任務(wù),任務(wù)沒(méi)有完結(jié)等一系列校驗(yàn) 2.驅(qū)動(dòng)狀態(tài)機(jī)更新工單狀態(tài) 3.完結(jié)任務(wù)異常場(chǎng)景
操作:主管瘋狂點(diǎn)擊通過(guò)按鈕3次(前提是按鈕點(diǎn)擊一次不會(huì)灰顯,就算灰顯也可以通過(guò)模擬請(qǐng)求來(lái)實(shí)現(xiàn))
異常情況:三個(gè)點(diǎn)擊線程都運(yùn)行完1,然后線程1驅(qū)動(dòng)狀態(tài)機(jī)(通過(guò) + 當(dāng)前狀態(tài):待TL審批)得到的結(jié)果是待主管審批,緊接著線程2驅(qū)動(dòng)狀態(tài)機(jī)(通過(guò) + 當(dāng)前狀態(tài):待主管審批)得到的結(jié)果是待財(cái)務(wù)審批,然后線程3再運(yùn)行驅(qū)動(dòng)狀態(tài)機(jī)(通過(guò) + 當(dāng)前狀態(tài):待財(cái)務(wù)審批)得到的結(jié)果是出賬成功(不考慮多次完結(jié)任務(wù)會(huì)出現(xiàn)異常)
異常分析:在該場(chǎng)景中,只要角色擁有「一審權(quán)限」就可以通過(guò)漏洞直接把該訂單審核出賬
解決方案:
細(xì)化狀態(tài)機(jī)中的每個(gè)審核操作
1.查詢?nèi)蝿?wù),查詢?cè)摴P任務(wù)對(duì)應(yīng)當(dāng)前操作類型(TL審批OR主管審批OR財(cái)務(wù)審批)
---這里不僅僅是「通過(guò)」操作,判斷當(dāng)前角色是否有對(duì)應(yīng)操作權(quán)限
2.根據(jù)當(dāng)前操作類型+當(dāng)前狀態(tài)驅(qū)動(dòng)狀態(tài)機(jī)
3.完結(jié)任務(wù)
在查詢?nèi)蝿?wù)之前加一個(gè)全局鎖,針對(duì)這筆工單進(jìn)行全局鎖定(更加優(yōu)雅)
場(chǎng)景二操作:一個(gè)角色同時(shí)擁有一審權(quán)限和二審權(quán)限,當(dāng)他打開(kāi)一個(gè)工單要進(jìn)行一審,但是其它主管已經(jīng)執(zhí)行了一審的動(dòng)作,并且更新了一些信息.因?yàn)樵摻巧?yè)面沒(méi)有刷新獲取不到更新的信息,然后點(diǎn)擊了通過(guò)按鈕
異常情況:點(diǎn)擊通過(guò)按鈕就相當(dāng)于進(jìn)行了二審,會(huì)造成該角色獲取不到最新信息而產(chǎn)生誤判
解決方案:在場(chǎng)景一增加一個(gè)全局鎖的前提下,可以給頁(yè)面?zhèn)鬟f一個(gè)工單modifyTime,在全局鎖里面判斷modifyTime是否一致,如果不一致說(shuō)明該筆工單已經(jīng)被更新了,可以給用戶相應(yīng)的提醒
其它在業(yè)務(wù)中整個(gè)狀態(tài)機(jī)的流轉(zhuǎn)都是確定的,所以為了保證狀態(tài)流轉(zhuǎn)正確,所以在更新數(shù)據(jù)庫(kù)狀態(tài)的時(shí)候,需要帶上關(guān)于狀態(tài)的樂(lè)觀鎖UPDATE XXX SET status = XXX WHERE id = XXX AND from_status = XXX
如果使用的是全局鎖,那么每個(gè)操作工單的地方都需要加上相應(yīng)的全局鎖
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/70868.html
摘要:鎖業(yè)務(wù)場(chǎng)景針對(duì)一個(gè)賠付工單由底下小二發(fā)起當(dāng)金額數(shù)量大于一定值以后針對(duì)這筆工單就會(huì)有層層審批風(fēng)控先一個(gè)審批流審批主管審批財(cái)務(wù)審批這里就會(huì)存在種權(quán)限一審權(quán)限二審權(quán)限終審權(quán)限當(dāng)這筆工單被小二提交以后就會(huì)給小二對(duì)應(yīng)的創(chuàng)建一個(gè)審批任務(wù)在主 鎖 業(yè)務(wù)場(chǎng)景 針對(duì)一個(gè)賠付工單(由底下小二發(fā)起),當(dāng)金額數(shù)量大于一定值以后,針對(duì)這筆工單就會(huì)有層層審批(風(fēng)控),先YY一個(gè)審批流「TL審批」--->「主管審批...
摘要:在昨天隊(duì)友代碼的過(guò)程中,發(fā)現(xiàn)了我們組分布式鎖的寫(xiě)法似乎有點(diǎn)問(wèn)題,實(shí)現(xiàn)代碼如下加鎖部分解鎖部分主要原理是使用了的去插入一組,其中要上鎖的標(biāo)識(shí)在項(xiàng)目中是鎖死用戶,如果上鎖失敗則返回。 最近在參加學(xué)校安排的實(shí)訓(xùn)任務(wù),我們小組需完成一套分布式&微服務(wù)跨境電商,雖然這題目看起來(lái)有點(diǎn)老套,并且隊(duì)友多是 Java 技術(shù)棧,所以我光榮(被迫) 的成為了一名前端,并順路使用 PHP 的 Swoole 幫...
閱讀 3174·2023-04-25 17:19
閱讀 623·2021-11-23 09:51
閱讀 1345·2021-11-08 13:19
閱讀 783·2021-09-29 09:34
閱讀 1683·2021-09-28 09:36
閱讀 1500·2021-09-22 14:59
閱讀 2715·2019-08-29 16:38
閱讀 2059·2019-08-26 13:40