在c/s或多層中,如果兩個用戶同時打開一條記錄,修改后提交會產生更新沖突;
據說辦法有二:1。打開同時鎖定表的記錄 2。浦獲錯誤,撤消其中一個用戶的修改,但是很少見到具體實現的代碼;請大家告訴具體的代碼怎么寫:
1。打開時如何鎖定一條記錄?
2。如何撲獲更新錯誤?在delphi中調試時會報“該記錄讀出后已經被再次修改”,而在運行時如何判定錯誤為更新沖突?因為更新時其他的錯誤如輸入不合法等也可能報錯,如何把更新沖突和其他的分開?
=====================================================================
http://hi.baidu.com/nboy/blog/item/8d61c93d8ab3dec19f3d6288.html
首先,這個問題只有在特殊情況下才算是問題,大多數情況下可以不作考慮。
然后,這是問題很難描述清楚,解決方案有多種,下面提供一種較方便易用的方式
場景(問題)描述如下:
0,用戶A、B同時打開一個頁面,頁面顯示,客戶表T_CUSTOMER字段(C_NAME、C_AGE)
姓名:張三,年齡:25
1,A 將姓名“張三”改為“張三1”,然后保存
2,B 將年齡“25”改為“30”,然后保存
這樣A的操作就被覆蓋了,姓名又變回“張三”了,大家一般怎么處處這種情況?
這里給出一個較易用的解決方案
給表添加一字段:LAST_UPDATE,即最后更新時間
回放場景
0,用戶A、B同時打開一頁面,面頁顯示:
姓名:張三,年齡:25,LAST_UPDATE:2008-10-17 13:45:00
1,A 將姓名“張三”改為“張三1”,然后保存
重點在這里:更新數據時WHERE條件里多一條件:AND LAST_UPDATE = '2008-10-17 13:45:00'
更新成功,此時觸發器會將當前時間“2008-10-17 13:46:00”賦值給LAST_UPDATE
2,B 將將年齡“25”改為“30”,然后保存
B更新數據時WHERE條件里也有這個條件:AND LAST_UPDATE = '2008-10-17 13:45:00',但此時LAST_UPDATE的值已經在A修改記錄時變成2008-10-17 13:46:00
下面要做的就是給出提示了:喔喲,此信息在你發呆這段時間已被人改過啦,所以你需要返工。
觸發器代碼如下:
===================================================
CREATE OR REPLACE TRIGGER T_CUSTOMER
BEFORE UPDATE ON T_CUSTOMER
FOR EACH ROW
/*
記錄最后修改時間
*/
BEGIN
:NEW.LAST_UPDATE := SYSDATE;
END;
===================================================
如果觸發器不熟悉或者只是不喜歡用觸發器,完全可以修改記錄時同時給LAST_UPDATE字段賦值,以此替代觸發器的作用。
----------------------------------------------------------------------------------------------------------------
http://blog.csdn.net/onemetre/archive/2010/11/06/5991658.aspx