2015-05-23 47 views
0

我正面臨鎖定表溢出問題,下面是它顯示的錯誤,一旦它顯示出來就會崩潰代碼。進度鎖定表溢出問題4GL

鎖表溢出,增加服務器-L(915)

我檢查了錯誤號,它是說我們需要修改服務器開始之前-L價值,並已設置默認爲500。但我不會想到,除非我是該公司的數據庫管理員,否則我已獲得改變該價值的特權。 我試圖做的是用所有鏈接表記錄(超過25個錶鏈接到每個成員記錄)清除大約11k個成員記錄,同時將每個表備份到單獨的文件中。所以大致它循環進入當成員如下,

for each member 
    EXCLUSIVE-LOCK: 

    /* 
     Then find each linked records in a order. 
     Extract them. 
     Delete them. 
    */ 
    Finally it extracts the member. 
    Delete member. 

end. 

當它擊中一定數量的成員記錄的程序崩潰了實現「EXCLUSIVE-LOCK」。因此,我不得不爲批次喜歡運行它,

for each member 
    EXCLUSIVE-LOCK: 

    Increment a member count. 
     When count = 1k 
      then RETURN. 
     /* 
     Then find each linked records in a order. 
     Extract them. 
     Delete them. 
    */ 
    Finally it extracts the member. 
    Delete member. 

end. 

所以從字面上我已經結束了與運行相同的代碼超過11次來完成這項工作。我希望有人應該遇到這個問題,如果你想分享一個長時間的解決方案,而不是我的臨時解決方案,會有很大的幫助。

回答

2

對於屬於交易一部分的每條記錄,您都需要鎖定。否則,其他用戶可能會在您的事務提交之前發生衝突的更改。

在你的代碼中,你有一個事務,它的作用域是FOR FOR EACHE。因此,對於「成員」記錄需要1個鎖,並且對於與該成員相關聯的每個鏈接記錄需要另一個鎖。

(因爲你沒有顯示真正的代碼,它也可能是您的實際代碼有一個事務範圍則更加廣闊......)

鎖表必須大到足以容納所有這些鎖。所有用戶也都可以共享鎖表 - 所以不僅要鎖住你的鎖,而且還必須有其他人正在做的任何空間。

FWIW - 500非常非常低。缺省值是8192.有兩個啓動參數,使用字母「l」,一個是大寫,-L,這是鎖表,它是一個服務器啓動參數。小寫,-l是「本地緩衝區大小」,它是一個客戶端參數。 (它控制有多少內存可用於本地變量。)

「批處理」,正如您所做的那樣,是確保沒有一個進程使用太多鎖的典型方法。但是,如果你的-L實際上只有500,那麼1000的批量就沒有意義了。 100更爲典型。

一個更好的方式來批:

define buffer delete_member for member. 
define buffer delete_memberLink for memberLink. /* for clarity I'll just do a single linked table... */ 

for each member no-lock: /* do NOT get a lock */ 

    batch_loop: do for delete_member, delete_memberLink while true transaction: 

    b = 0. 

    for each delete_memberLink exclusive-lock where delete_memberLink.id = member.id: 
     b = b + 1. 
     delete delete_memberLink. 
     if b >= 100 then next batch_loop. 
    end. 

    find delete_member exclusive-lock where recid(delete_member) = recid(member). 

    leave batch_loop. /* this will only happen if we did NOT execute the NEXT */ 

    end. 

end. 
0

你也可以增加你的-L數據庫啓動參數要考慮到你的一次性查詢/刪除。