時間:2015-06-28 00:00:00 來源:IT貓撲網(wǎng) 作者:網(wǎng)管聯(lián)盟 我要評論(1)
樂觀鎖定,即把所有鎖定都延遲到即將執(zhí)行更新之前才做。換句話說,我們會修改屏幕上的信息而不要鎖。我們很樂觀,認為數(shù)據(jù)不會被其他用戶修改;因此,會等到最后一刻才去看我們的想法對不對。總之,就是當用戶已經(jīng)填好修改內容,點擊修改按鈕的時候,我們才去給要修改的記錄加鎖。
這種鎖定方法在所有環(huán)境下都行得通,但是采用這種方法的話,執(zhí)行更新的用戶"失敗"的可能性會加大。這說明,這個用戶要更新他的數(shù)據(jù)行時,發(fā)現(xiàn)數(shù)據(jù)已經(jīng)修改過,所以他必須從頭再來。
實現(xiàn)樂觀并發(fā)控制的方法有很多種。我們將介紹三種方法,分別是:
1. 使用一個特殊的列,這個列由一個數(shù)據(jù)庫觸發(fā)器或應用程序代碼維護,可以告訴我們記錄的"版本".
2. 使用一個校驗和或散列值,這是使用原來的數(shù)據(jù)計算得出的.
3. 使用新增的Oracle 10g 特性ORA_ROWSCN.
下面介紹第一種方法:
這是一個簡單的實現(xiàn),如果你想保護數(shù)據(jù)庫表不出現(xiàn)丟失更新問題,應對每個要保護的表增加一列。這一列一般是NUMBER或DATE/TIMESTAMP列,通常通過表上的一個行觸發(fā)器來維護。每次修改行時,這個觸發(fā)器要負責遞增NUMBER列中的值,或者更新DATE/TIMESTAMP列。用戶每次進行修改的時候,會拿自己取出的這一列的值與數(shù)據(jù)庫中的進行比較,如果相同,說明還沒有人修改過,反之,則已經(jīng)修改過了!
其實,,對于這么簡單的工作,建議還是避免使用觸發(fā)器,而讓DML來負責。觸發(fā)器會引入大量開銷,而且在這種情況下沒有必要使用它們。
但是,也不能總是依賴各個應用來維護這個字段,原因是多方面的。例如,這樣會增加應用程序代碼,而且只要是表中需要修改的地方,都必須重復這些代碼,并正確地實現(xiàn)。 在一個大型應用中,這樣的地方可能很多。另外,將來開發(fā)的每個應用也必須遵循這些規(guī)則。應用程序代碼中很可能會"遺漏"某一處,未能適當?shù)厥褂眠@個字段。 因此,如果應用程序代碼本身不負責維護這個LAST_MOD字段,我相信應用也不應負責檢查這個LAST_MOD字 段(如果它確實能執(zhí)行檢查,當然也能執(zhí)行更新?。K栽谶@種情況下,我建議把更新邏輯封裝到一個存儲過程中,而不要讓應用直接更新表。如果無法相信應用 能維護這個字段的值,那么也無法相信它能正確地檢查這個字段。存儲過程可以取以上更新中使用的綁定變量作為輸入,執(zhí)行同樣的更新。當檢測到更新了0行時,存儲過程會向客戶返回一個異常,讓客戶知道更新實際上失敗了。
個人感覺還是太麻煩,且看下面還有兩個方法!
關鍵詞標簽:oracle
相關閱讀
熱門文章 Oracle中使用alter table來增加,刪除,修改列的語法 oracle中使用SQL語句修改字段類型-oracle修改SQL語句案例 誤刪Oracle數(shù)據(jù)庫實例的控制文件 為UNIX服務器設置Oracle全文檢索
人氣排行 oracle中使用SQL語句修改字段類型-oracle修改SQL語句案例 Oracle中使用alter table來增加,刪除,修改列的語法 ORACLE SQL 判斷字符串是否為數(shù)字的語句 ORACLE和SQL語法區(qū)別歸納(1) oracle grant 授權語句 ORACLE修改IP地址后如何能夠使用 如何加速Oracle大批量數(shù)據(jù)處理 Oracle刪除表的幾種方法