日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

sap abap开发从入门到精通_SAP开发-ABAP数据字典(锁)

發(fā)布時間:2023/12/2 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 sap abap开发从入门到精通_SAP开发-ABAP数据字典(锁) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

企業(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。