現象如下:

建一個EMP數據塊,基於EMP表。再建一個控制塊,內有一個button。Button的When-Button-Pressed Trigger代碼為一個update語句:

update emp set sal = sal + 10;

第一步:查詢EMP塊,之後點擊Button。更新了基表數據,但是Form中顯示數據沒變。

第二步:試圖修改EMP塊中任何一行數據,FRM-40654錯誤出現:Record has been updated by another user. Re-query to see change.

Forms運行過程中,數據庫只有一個連接,根本不可能有其它用戶修改。錯誤是怎麼產生的呢?

下面分析一下在第二步更改block中數據時發生了什麼:

在試圖更改block中數據的時候,Forms先發出一個對該行數據的select … for update nowait查詢,希望鎖定該行。如果不能鎖定,Forms提示Could not reserve records (2 trys). Keep trying?。如果用戶選擇No,Forms報告FRM-40510錯誤:ORACLE error: unable to reserve record for update or delete。

即使前面的查詢鎖定步驟成功,Forms還要比較查詢結果和當前行的值是否一致。如果兩者不完全相同,Forms拋出FRM-40654錯誤。這麼做主要是為了防止lost update的情形,不讓用戶根據過時的數據來做出修改。



[補充]

block的lock mode屬性為automatic或immediate,在修改記錄時Forms會立即鎖定數據庫記錄;如果設為delayed,在保存時Forms才嘗試鎖定記錄。
arrow
arrow
    全站熱搜

    iamferrari 發表在 痞客邦 留言(1) 人氣()