務(wù)暫停,ABAP 怎樣讓一項(xiàng)任務(wù)暫時(shí)失去行動(dòng)能力)
上午的訂單處理鏈路里,一批海外子公司的銷售訂單正等著送往下游。此時(shí)發(fā)現(xiàn)價(jià)格條件同步有誤,繼續(xù)發(fā)送會(huì)把錯(cuò)誤價(jià)格帶進(jìn)后續(xù)流程。業(yè)務(wù)希望這些訂單暫時(shí)停住,修好條件后仍能接著處理,其他公司的訂單照常運(yùn)行。這件事很像《仙劍奇?zhèn)b傳 1》里的迷魂香。游戲中的迷魂香能讓敵人昏睡五回合,重點(diǎn)是暫時(shí)剝奪行動(dòng)機(jī)會(huì),效果過(guò)去后,對(duì)方還能繼續(xù)行動(dòng)。放到 ABAP 世界,答案是有相近的機(jī)制,卻沒(méi)有一件叫迷魂香、施放后便能讓任意程序自動(dòng)暫停五個(gè)回合的通用物品。程序必須明確誰(shuí)是目標(biāo)、哪些動(dòng)作需要攔截、暫停何時(shí)結(jié)束,以及恢復(fù)時(shí)怎樣避免重復(fù)執(zhí)行。這個(gè)類比還有一個(gè)容易忽略的地方。游戲回合是天然存在的計(jì)時(shí)單位,企業(yè)系統(tǒng)卻同時(shí)運(yùn)行著用戶請(qǐng)求、后臺(tái)作業(yè)、消息隊(duì)列和數(shù)據(jù)庫(kù)事務(wù)。訂單暫停五分鐘、接口消息暫停五批、作業(yè)暫停到明早,這三種要求看起來(lái)相似,技術(shù)實(shí)現(xiàn)卻各不相同。我們得先弄清業(yè)務(wù)所說(shuō)的昏睡,究竟是不能修改數(shù)據(jù)、不能執(zhí)行某項(xiàng)動(dòng)作,還是暫時(shí)不消費(fèi)已經(jīng)排隊(duì)的消息。鎖住對(duì)象,不等于讓對(duì)象睡著許多 ABAP 開(kāi)發(fā)者聽(tīng)到暫時(shí)不能行動(dòng),會(huì)立刻想到鎖對(duì)象。經(jīng)典 ABAP 可以在數(shù)據(jù)字典中定義鎖對(duì)象,激活后使用系統(tǒng)生成的ENQUEUE_...和DEQUEUE_...函數(shù)模塊。兩個(gè)會(huì)話同時(shí)修改同一張訂單時(shí),一個(gè)會(huì)話取得排他鎖,另一個(gè)會(huì)話的沖突修改就會(huì)受阻。這確實(shí)有幾分迷魂香的味道,目標(biāo)暫時(shí)不能做某件事。不過(guò),鎖的職責(zé)是協(xié)調(diào)并發(fā)修改。它沒(méi)有表達(dá)訂單為何暫停,也不會(huì)替業(yè)務(wù)記住恢復(fù)時(shí)間。鎖釋放后,被擋住的請(qǐng)求能否繼續(xù),還取決于調(diào)用方怎樣處理鎖沖突。它也未必會(huì)阻止所有讀取、所有作業(yè)或系統(tǒng)中的每一種操作。鎖住訂單號(hào),并不能推導(dǎo)出與該訂單有關(guān)的外部接口、定價(jià)計(jì)