ABAP 锁对象与加锁机制
激活鎖定對(duì)象時(shí),產(chǎn)生的 FM 的名字是什么?
答案:首先要在 ABAP 字典中創(chuàng)建鎖對(duì)象,然后才能在 ABAP 程序中設(shè)鎖。創(chuàng)建鎖對(duì)象時(shí),系統(tǒng)會(huì)自動(dòng)生成兩個(gè) FM 來(lái)進(jìn)行鎖管理。用于設(shè)鎖的 FM 為: ENQUEUE_<鎖對(duì)象名>。它用于在鎖表(Lock Table)中生成一個(gè)鎖項(xiàng)(Lock Entry)。若設(shè)鎖不成功的話(huà),就會(huì)在 Return 中反映出來(lái)。用于釋放鎖的 FM 為:DEQUEUE_<鎖對(duì)象名>。它用于從鎖表中刪除一個(gè)鎖項(xiàng)。在 ABAP 程序中,只需使用 "CALL FUNCITION ..." 語(yǔ)句就可以調(diào)用它們。這兩個(gè)鎖 FM 是在 SAP 系統(tǒng)的一個(gè)特殊工作進(jìn)程中執(zhí)行的,專(zhuān)門(mén)進(jìn)行鎖管理。它運(yùn)行在一個(gè)單獨(dú)的服務(wù)器上,而該服務(wù)器專(zhuān)門(mén)用于維護(hù)整個(gè) SAP 系統(tǒng)的主鎖表(Central Locak Table)。
有兩種鎖類(lèi)型:共享鎖——只讀鎖,一個(gè)用戶(hù)正在讀數(shù)據(jù)時(shí),阻止其他用戶(hù)更改該數(shù)據(jù)。
????????????????? 獨(dú)占鎖——可寫(xiě)鎖,一個(gè)用戶(hù)正在修改數(shù)據(jù)時(shí),阻止其他用戶(hù)更改該數(shù)據(jù)。
?
SAP鎖機(jī)制 一、SAP為什么要設(shè)置鎖: ?? 1,保持?jǐn)?shù)據(jù)的一致性 ???? 如果幾個(gè)用戶(hù)要訪(fǎng)問(wèn)同樣的資源,需要找到一種同步訪(fǎng)問(wèn)的方法去保持?jǐn)?shù)據(jù)的一致性。比如說(shuō),在航班預(yù)訂系統(tǒng)中,需要檢查還有沒(méi)有空座位,當(dāng)檢查的時(shí)候,你不想別人修改重要的數(shù)據(jù)(空座位的數(shù)量)。 ?? 2,僅僅用Database鎖是不夠的 ???? 數(shù)據(jù)庫(kù)管理系統(tǒng)物理鎖定了要修改的行記錄,其他用戶(hù)要等到數(shù)據(jù)庫(kù)鎖釋放才能訪(fǎng)問(wèn)這個(gè)記錄。 ???? 在SAP系統(tǒng)中,當(dāng)一個(gè)新屏幕顯示的時(shí)候會(huì)釋放掉Database鎖,因?yàn)槠聊坏母淖儠?huì)觸發(fā)一個(gè)隱式的DB COMMIT。如果數(shù)據(jù)是從好幾個(gè)屏幕收集來(lái)的話(huà),而且在這段時(shí)間內(nèi)這些數(shù)據(jù)會(huì)分別被鎖定,僅僅用Database鎖就不夠了。 ???? SAP系統(tǒng)在應(yīng)用服務(wù)器層面有一個(gè)全局的LOCK TABLE,可以用來(lái)設(shè)置邏輯鎖來(lái)鎖定相關(guān)的表?xiàng)l目,并有ENQUEUE工作進(jìn)程來(lái)管理這些鎖。SAP鎖是一種邏輯意義上的鎖,有可能你鎖定的表?xiàng)l目在DATABASE上根本就不存在。
二、鎖對(duì)象和其對(duì)應(yīng)的Function Module ???
在SE11里創(chuàng)建鎖對(duì)象,自定義的鎖對(duì)象都必須以EZ或者EY開(kāi)頭來(lái)命名。一個(gè)鎖對(duì)象里只包含一個(gè)PRIMARY TABLE,可以包含若干個(gè)SECONDARY TABLE,鎖的模式有三種:E,S,X。LOCK PARAMETERS里填寫(xiě)你要根據(jù)哪些字段來(lái)鎖定表?xiàng)l目。 ???
模式E:當(dāng)更改數(shù)據(jù)的時(shí)候設(shè)置為此模式。 ???
模式S:本身不需要更改數(shù)據(jù),但是希望顯示的數(shù)據(jù)不被別人更改。 ???
模式X:和E類(lèi)似,但是不允許累加,完全獨(dú)占。 ???
如果你在一個(gè)程序里成功對(duì)一個(gè)鎖對(duì)象加鎖之后,如果模式為E,其他用戶(hù)不能再對(duì)這個(gè)鎖對(duì)象加E、X、S模式的任意一種鎖; ???
如果你在一個(gè)程序里成功對(duì)一個(gè)鎖對(duì)象加鎖之后,如果模式為X,其他用戶(hù)不能再對(duì)這個(gè)鎖對(duì)象加E、X、S模式的任意一種鎖; ?
?? 如果你在一個(gè)程序里成功對(duì)一個(gè)鎖對(duì)象加鎖之后,
如果模式為S,其他用戶(hù)不能再對(duì)這個(gè)鎖對(duì)象加E、X模式的鎖,但是可以加S模式的鎖; ?
?? 如果你在一個(gè)程序里成功對(duì)一個(gè)鎖對(duì)象加鎖之后,如果模式為E,在這個(gè)程序,你還可以再對(duì)這個(gè)鎖對(duì)象加E、S模式的鎖,X模式的不可以。 ?
?? 如果你在一個(gè)程序里成功對(duì)一個(gè)鎖對(duì)象加鎖之后,如果模式為X,在這個(gè)程序,你不可以再對(duì)這個(gè)鎖對(duì)象加E、X、S模式的鎖。 ?
?? 如果你在一個(gè)程序里成功對(duì)一個(gè)鎖對(duì)象加鎖之后,如果模式為S,在這個(gè)程序,你還可以再對(duì)這個(gè)鎖對(duì)象加S模式的鎖,
如果沒(méi)有別的用戶(hù)對(duì)其加S模式的鎖,那么你還可以對(duì)其加E模式的鎖。X模式的不可以。 ???
當(dāng)激活鎖對(duì)象的時(shí)候,系統(tǒng)會(huì)自動(dòng)創(chuàng)建兩個(gè)FM,ENQUEUE_<鎖對(duì)象名>和DEQUEUE_<鎖對(duì)象名>,分別用來(lái)鎖定和解鎖。
三、鎖定和解鎖 ??? 當(dāng)用邏輯鎖來(lái)鎖定表?xiàng)l目的時(shí)候,系統(tǒng)會(huì)自動(dòng)向LOCK TABLE中寫(xiě)入記錄。 當(dāng)調(diào)用設(shè)置鎖的FM時(shí),LOCK PARAMETERS如果沒(méi)有指明,系統(tǒng)會(huì)鎖定整個(gè)表。當(dāng)然,LOCK PARAMETER:
CLIENT有點(diǎn)特殊,如果不指定,默認(rèn)是SY-MANDT;如果指定相應(yīng)的CLIENT,會(huì)鎖定對(duì)應(yīng)CLIENT上的相應(yīng)的表記錄;如果設(shè)置為SPACE,則鎖定涉及所有的CLIENT。 ??? 當(dāng)邏輯鎖設(shè)置失敗后,一般會(huì)有兩種例外。一個(gè)是EXCEPTION:FOREIGN_LOCK,意思是已經(jīng)被鎖定了;另一個(gè)是EXCEPTION:SYSTEM_FAILURE。 ???
有些情況下,程序中設(shè)置成功的邏輯鎖會(huì)隱式的自己解鎖。比如說(shuō)程序結(jié)束發(fā)生的時(shí)候(MESSAGE TYPE為A或者X的時(shí)候),使用語(yǔ)句LEAVE PROGRAM,LEAVE TO TRANSACTION,或者在命令行輸入/n回車(chē)以后。 ???
在程序的結(jié)束可以用DEQUEUE FUNCTION MODULE來(lái)解鎖(當(dāng)然如果你不寫(xiě)這個(gè),程序結(jié)束的時(shí)候也會(huì)自動(dòng)的解鎖),這個(gè)時(shí)候,系統(tǒng)會(huì)自動(dòng)從LOCK TABLE把相應(yīng)的記錄刪除。使用DEQUEUE FUNCTION MODULE來(lái)解鎖的時(shí)候,不會(huì)產(chǎn)生EXCEPTION。要解開(kāi)你在程序中創(chuàng)建的所有的邏輯鎖,可以用FM:DEQUEUE_ALL. ?? 四、上鎖的一般步驟 ??? 先上鎖,上鎖成功之后,從數(shù)據(jù)庫(kù)取數(shù)據(jù),然后更改數(shù)據(jù),接著更新到數(shù)據(jù)庫(kù),最后解鎖。按照這個(gè)步驟,才能保證更改完全運(yùn)行在鎖的保護(hù)機(jī)制下。
總結(jié)
以上是生活随笔為你收集整理的ABAP 锁对象与加锁机制的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: PO增强,明细动抬头动
- 下一篇: ABAP 程序运行锁