摘要:方法機(jī)制采用了這種機(jī)制。然后再回到用戶的這個(gè)編輯窗口,此時(shí)根本不知道該已經(jīng)被另一個(gè)用戶修改了。修改了的字段,點(diǎn)擊保存按鈕。收到這個(gè)提示信息。如果失敗,當(dāng)前的保存操作將不會執(zhí)行。這種應(yīng)用,消費(fèi)的是基于加上實(shí)現(xiàn)的。這個(gè)加鎖邏輯調(diào)用的是傳統(tǒng)的。
方法1: ETAG機(jī)制
SAP CRM Fiori采用了這種機(jī)制。
看一個(gè)具體的例子來理解。假設(shè)我用用戶名Jerry選中了這個(gè)ID為3456的Opportunity,點(diǎn)擊Edit按鈕之后:
會觸發(fā)一個(gè)讀操作發(fā)到后臺:
后臺響應(yīng)這個(gè)讀請求,并且在響應(yīng)的頭部字段ETAG里寫入了對應(yīng)的值。
這個(gè)26AE結(jié)尾的ETAG的值可以由應(yīng)用程序采取不同的邏輯計(jì)算,可以直接采用請求節(jié)點(diǎn)對應(yīng)的最后修改時(shí)間戳(Last Changed Timestamp), 例如下面這段ABAP代碼:
也可以基于數(shù)據(jù)的完整內(nèi)容計(jì)算一個(gè)HASH值出來作為ETAG返回給Fiori UI:
現(xiàn)在我用另一個(gè)用戶,對同一個(gè)Opportunity做了修改,成功保存。然后再回到用戶Jerry的這個(gè)編輯窗口,此時(shí)Jerry根本不知道該Opportunity已經(jīng)被另一個(gè)用戶修改了。Jerry修改了Opportunity的Name字段,點(diǎn)擊保存按鈕。
收到這個(gè)提示信息。
從Chrome Development Tool里能觀察到,當(dāng)Jerry點(diǎn)擊了保存按鈕后,發(fā)送到后臺的請求的頭部包含了一個(gè)If-Match字段,這個(gè)字段的值就是Jerry第一次點(diǎn)擊編輯按鈕時(shí),后臺返回給Jerry的26AE結(jié)尾的ETAG字段。
背后發(fā)生了什么事請呢?在框架的方法CHECK_BEFORE_MODIFICATION里,框架會把Fiori UI請求傳進(jìn)來的ETAG和當(dāng)前最新的ETAG做比較:
CHECK_BEFORE_MODIFICATION又會調(diào)用CHECK_ETAG_MATCH方法。如果check失敗,當(dāng)前的保存操作將不會執(zhí)行。
方法2: 基于BOPF的鎖實(shí)現(xiàn)這種方式用于S/4HANA的Fiori應(yīng)用,比如Material application。這種Fiori應(yīng)用,消費(fèi)的OData service是基于CDS view 加上BOPF實(shí)現(xiàn)的。
打開一個(gè)Material,點(diǎn)擊Edit:
此時(shí)到ABAP后臺使用事務(wù)碼SM12能觀察到Material對應(yīng)的數(shù)據(jù)庫表被鎖住了:
這是怎么實(shí)現(xiàn)的呢?
在S/4HANA后臺使用事務(wù)碼BOBX打開BO模型I_PRODUCTWD. 展開模型,雙擊EDIT,能看到這個(gè)Edit實(shí)現(xiàn)的類為CL_I_DR_PRODUCTWD.
雙擊這個(gè)class,它的方法LOCK_ACTIVE_DOCUMENT就是響應(yīng)Fiori UI上編輯按鈕點(diǎn)擊的處理函數(shù)。
我們在這個(gè)方法里設(shè)置斷點(diǎn),然后在UI上點(diǎn)擊編輯按鈕,斷點(diǎn)觸發(fā)。從調(diào)用棧即可清除觀察到編輯按鈕點(diǎn)擊之后,程序執(zhí)行流是如何從BOPF框架投遞到Material應(yīng)用的枷鎖代碼。這個(gè)加鎖邏輯調(diào)用的是傳統(tǒng)的ABAP Enqueue function module。
要獲取更多Jerry的原創(chuàng)技術(shù)文章,請關(guān)注公眾號"汪子熙"或者掃描下面二維碼:
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/107353.html
摘要:目前被廣泛用于和的眾多應(yīng)用中,以及和一些正在開發(fā)的新一代云產(chǎn)品中。年月時(shí),我和德國一位負(fù)責(zé)的同事就這個(gè)話題在半小時(shí)的電話會議里產(chǎn)生了爭執(zhí)。德國同事看了之后,同意了我的意見。和微信集成系列教程這個(gè)系列教程里,和微信的交互,使用了,使用了。 OData(Open Data Protocol)協(xié)議是一個(gè)開放的工業(yè)標(biāo)準(zhǔn),用于定義RESTFul API的設(shè)計(jì)和使用。我的文章標(biāo)題前加上SAP的前綴...
摘要:目前被廣泛用于和的眾多應(yīng)用中,以及和一些正在開發(fā)的新一代云產(chǎn)品中。年月時(shí),我和德國一位負(fù)責(zé)的同事就這個(gè)話題在半小時(shí)的電話會議里產(chǎn)生了爭執(zhí)。德國同事看了之后,同意了我的意見。和微信集成系列教程這個(gè)系列教程里,和微信的交互,使用了,使用了。 OData(Open Data Protocol)協(xié)議是一個(gè)開放的工業(yè)標(biāo)準(zhǔn),用于定義RESTFul API的設(shè)計(jì)和使用。我的文章標(biāo)題前加上SAP的前綴...
閱讀 1324·2021-11-24 10:24
閱讀 4167·2021-11-22 15:29
閱讀 1099·2019-08-30 15:53
閱讀 2801·2019-08-30 10:54
閱讀 1987·2019-08-29 17:26
閱讀 1292·2019-08-29 17:08
閱讀 613·2019-08-28 17:55
閱讀 1591·2019-08-26 14:01