現象如下: 建一個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才嘗試鎖定記錄。
文章標籤
全站熱搜
創作者介紹
創作者 iamferrari 的頭像
iamferrari

愛無所不在

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