sap abap开发从入门到精通_SAP开发-ABAP数据字典(锁)
企業(yè)級軟件或開發(fā)框架,必然支持后臺高并發(fā),即支持多人同時訪問數(shù)據(jù)庫。SAP作為資深企業(yè)管理軟件,自然也不例外,ABAP可以很方便的開發(fā)出支持高并發(fā)的程序,要實現(xiàn)高并發(fā),正確使用鎖對象是其中一個重要環(huán)節(jié),今天我們就一起來看看SAP的鎖對象。
SAP鎖對象屬于數(shù)據(jù)字典的一部分,它并不是數(shù)據(jù)庫鎖,而是存在于隊列應(yīng)用服務(wù)器內(nèi)存中,是一種邏輯鎖,假設(shè)現(xiàn)在A,B兩個用戶要同時修改一張表中的記錄,為了保證數(shù)據(jù)一致性,程序先為A用戶加鎖,加鎖成功后,A用戶可以正常修改表。這時B用戶也要修改此表,程序同樣嘗試為B用戶加鎖,但發(fā)現(xiàn)表已經(jīng)被鎖定,那么加鎖失敗,程序需要提示B用戶表已被鎖定。只有當A用戶修改完畢,將鎖釋放,B用戶才可以正常修改表。
SAP鎖有多種模式,常用的有E, S, X, O這幾種。下面分別做簡要說明:
模式E:當更改數(shù)據(jù)的時候設(shè)置為此模式。
模式S:本身不需要更改數(shù)據(jù),但是希望顯示的數(shù)據(jù)不被別人更改。
模式X:和E類似,但是不允許累加,完全獨占。
模式O:樂觀鎖,多個用戶可以重復(fù)加樂觀鎖,但當有新的用戶加了排它鎖E,或者已有用戶的樂觀鎖提升為排它鎖時,所有的樂觀鎖將失效。
除了上述幾種模式,還要理解鎖的擁有者即owner,一般來說,SAP鎖要么屬于dialog會話進程,要么屬于update進程。程序運行是從dialog會話進程開始的,當調(diào)用call function...in update task時,會進入update 進程,這個時候update進程會繼承鎖對象。這兩種擁有者的區(qū)別在于,如果擁有者是update進程,那么執(zhí)行commit work后,鎖會自動消失。
理解了鎖的模式和擁有者,我們來看看在系統(tǒng)中如何創(chuàng)建和使用鎖對象。
步驟1:事務(wù)碼SE11,選擇所對象,輸入EZ_ZTDEPEMP。注意所對象要求必須E 開頭。
步驟2:選擇鎖模式,常用模式上面有介紹過,一般選擇E。
步驟3:輸入鎖參數(shù),默認是表的關(guān)鍵字。輸入?yún)?shù)后,可以指定鎖定那些記錄,如果參數(shù)為空,則鎖定整張表。保存激活后,鎖對象就創(chuàng)建成功了。
那么如何使用這個鎖對象呢,SAP鎖對象在創(chuàng)建的時候,會額外自動創(chuàng)建兩個函數(shù),ENQUEUE_EZ_XXXXX 和 DEQUEUE_EZ_XXXXX。具體到我們剛才創(chuàng)建的鎖對象,函數(shù)分別是ENQUEUE_EZ_ZTDEPEMP 和 DEQUEUE_EZ_ZTDEPEMP,用于加鎖和解鎖。在程序中調(diào)用這兩個函數(shù),然后可以通過事務(wù)碼SM12觀察加鎖和解鎖的情況。
一起來看一段鎖產(chǎn)生沖突的代碼:
CALL FUNCTION 'ENQUEUE_EZ_ZTDEPEMP'EXPORTINGmode_ztdepemp = 'E'mandt = sy-mandt * DEPNO = '001' * EMPNO = '000001' * X_DEPNO = ' ' * X_EMPNO = ' '_scope = '1' * _WAIT = ' ' * _COLLECT = ' 'EXCEPTIONSforeign_lock = 1system_failure = 2OTHERS = 3. IF sy-subrc <> 0. * Implement suitable error handling here ENDIF.打開兩個窗口運行這段程序,第一個窗口運行程序后,通過事務(wù)碼SM12,查看鎖對象,
可以看到表ZTDEPEMP加鎖成功了,第二個窗口再次運行程序,會發(fā)現(xiàn)沒有產(chǎn)生新的鎖對象,通過debug,發(fā)現(xiàn)sy-subrc = 1,說明表再次加鎖和現(xiàn)有的鎖沖突了,不應(yīng)該繼續(xù)更改表。
上面的程序,有兩個重要參數(shù),
mode_ztdepemp = 'E',這個參數(shù)就是之前提到的鎖模式。E表示更新排它鎖。一個用戶加E類型鎖后,其它用戶就不能繼續(xù)加鎖。
_scope = '1',這個參數(shù)用來指定鎖的擁有者owner。_scope = '1'時,鎖的擁有者是dialog會話。_scope = '2'時,當出現(xiàn)CALL FUNCTION 'XXX' IN UPDATE TASK 時,update會話就會繼承這個鎖,這樣在commit work時,鎖就會自動釋放掉。我們將上面的代碼稍作修改,_scope = '2'。再通過debug 和SM12觀察鎖對象,可以驗證上面的鎖機制。
CALL FUNCTION 'ENQUEUE_EZ_ZTDEPEMP'EXPORTINGmode_ztdepemp = 'E'mandt = sy-mandt * DEPNO = '001' * EMPNO = '000001' * X_DEPNO = ' ' * X_EMPNO = ' '_scope = '2' * _WAIT = ' ' * _COLLECT = ' 'EXCEPTIONSforeign_lock = 1system_failure = 2OTHERS = 3. IF sy-subrc <> 0. * Implement suitable error handling here ENDIF.CALL FUNCTION 'ZFM_UPDATE_DEPEMP' IN UPDATE TASK.COMMIT WORK.最后,我們來看看樂觀鎖的使用。假設(shè)現(xiàn)在有兩個屏幕都要修改同一張表,如果使用排它鎖E,那么只有一個屏幕可以在修改模式下查看數(shù)據(jù)。如果我們需要多個屏幕都以修改模式來查看,那可以使用樂觀鎖O。當數(shù)據(jù)需要保存時,再將樂觀鎖升級為排它鎖。升級的同時,其它的樂觀鎖都會自動消除。如何使用樂觀鎖和升級成排它鎖,可以參考下面代碼。
CALL FUNCTION 'DEQUEUE_EZ_ZTDEPEMP'EXPORTINGmode_ztdepemp = 'O'mandt = sy-mandt * DEPNO = '001' * EMPNO = '000001' * X_DEPNO = ' ' * X_EMPNO = ' ' * _SCOPE = '3' * _SYNCHRON = ' ' * _COLLECT = ' '.CALL FUNCTION 'ENQUEUE_EZ_ZTDEPEMP'EXPORTINGmode_ztdepemp = 'R'mandt = sy-mandt * DEPNO = '001' * EMPNO = '000001' * X_DEPNO = ' ' * X_EMPNO = ' '_scope = '1' * _WAIT = ' ' * _COLLECT = ' 'EXCEPTIONSforeign_lock = 1system_failure = 2OTHERS = 3. IF sy-subrc <> 0. * Implement suitable error handling here ENDIF.先將mode_ztdepemp = 'O' 設(shè)置為O,即為樂觀鎖,再將mode_ztdepemp = 'R' 設(shè)置為R,升級為排它鎖。
SAP鎖對象就介紹到這里了,希望大家能不斷積累經(jīng)驗,寫出更加健壯的程序。如有問題,可加入群討論。
微信號:eckwise
總結(jié)
以上是生活随笔為你收集整理的sap abap开发从入门到精通_SAP开发-ABAP数据字典(锁)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我国成功在空间站发射微纳卫星
- 下一篇: 双屏全屏跳回到主屏_双屏笔记本了解下?剪