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