單問題復雜化,下面說說實際有效的解決方案; 就這個丟失更新問題,可以通過數據庫的鎖來實現,基本兩種思路,一種是悲觀鎖,另外一種是樂觀鎖; 簡單的說就是一種假定這樣的問題是高概率的,最好一開始就鎖住,免得更新老是失敗;另外一種假定這樣的問題是小概率的,最后一步做更新的時候再鎖住,免得鎖住時間太長影響其他人做有關操作;
6. 樂觀鎖的方法
這里先說web開發中常用的樂觀鎖的方法:
1.很簡單,就是使用前面所說的這樣一條SQL,這其實是所謂使用”前鏡像”的方式來保證需要更新的數據是符合要求的,
update order_table set status = ‘已發貨’ where order_id = 001 and status = ‘有效’ Tom的書上舉的例子是對所有列做更新,所以他的SQL大致如下 Update table set 買粉絲l1 = new買粉絲l1value, 買粉絲l2 = new買粉絲l2value…. where 買粉絲l1 = old買粉絲l1value and 買粉絲l2 = old買粉絲l2value…. 這個我覺得需要根據應用具體分析,如果需要判斷所有的值,那就判斷所有的值,如果只關心其中一個或部分值,那只需要取相關的值就好了,就比如這里的訂單的狀態
2.使用版本列[比如時間戳
這個方法比較簡單,也最常用,就是在數據庫表格中加一列last_modified_date,就是最后更新的時間,每次更新的時候都將這列設成systimestamp,當前系統時間;
然后每次更新的時候,就改成這樣 Update table set 買粉絲l = newvalue where id = ** and last_modified_date = old last_modified_date 這樣,就可以檢驗出數據庫的值是否在上次查看和這次更新的時候發生了變化,如果發生了變化,那么last_modified_date就變化了,以后的更新就會返回更新了0行,系統就可以通知用戶數據發生了變化,然后選擇刷新數據或者其他流程。
至于這個last_modified_date的維護,可以選擇讓應用每次都維護這個值,或者是使用存儲過程來包裝更新的操作,或者是使用觸發器來更新相關的值。幾種方法各有利弊,比如應用維護需要保證每段相關代碼都正確的維護了這個值;存儲過程有一定的開銷,通常很多開發對寫存儲過程可能也不熟練;觸發器是簡單的實現,但是也是有開銷的。具體使用哪種方法需要根據實際情況具體取舍。
3.使用校驗或Hash值
這種方法和前面的方法類似,無非是根據其他有實際意義的列來計算出一個虛擬的列,我個人覺得TOM在介紹這個純粹是介紹了一種”奇技淫巧”,反正我是在實際過程中不知道哪里會需要這樣的解決方案,或許也是因為我知道的太少了吧:)
4.使用Oracle 10g的ORA_ROWSCN
這個就是利用10g的一個ora_rows買粉絲特性,可以對每行做精確追蹤,不過這個要求在create table的時候就指定相關參數,表格如果創建了以后就不能用alter table來修改了,因為這依賴于物理的實際存儲。 同樣,我覺得這也可以歸為”奇技淫巧”一類; 具體如果有興趣了解詳情的話,可以參考Tom的書
我們一直都在努力堅持原創.......請不要一聲不吭,就悄悄拿走。
我原創,你原創,我們的內容世界才會更加精彩!
【所有原創內容版權均屬TechTarget,歡迎大家轉發分享。但未經授權,嚴禁任何媒體(平面媒體、網絡媒體、自媒體等)以及買粉絲買粉絲復制、轉載、摘編或以其他方式進行使用。】
買粉絲買粉絲
TechTarget
官方微博
TechTarget中國
相關資源:oracle樂觀鎖和悲觀鎖詳細教程_oracle的樂觀鎖-Oracle文檔類資源...
點擊閱讀全文
打開CSDN,閱讀體驗更佳
Oracle數據庫悲觀鎖與樂觀鎖_diweikang的博客
注:對于悲觀鎖是針對并發的可能性比較大,而一般在我們的應用中用樂觀鎖足以。 Oracle的悲觀鎖需要利用一條現有的連接,分成兩種方式,從SQL語句的區別來看,就是一種是for update,一種是for update nowait的形式。 1. 執行select xxx ...
ORACLE悲觀鎖和樂觀鎖_hongwei3344661的博客
1、無論是選擇悲觀鎖策略,還是樂觀鎖策略。如果一個對象被上了鎖,那么該對象都會受這個鎖的控制和影響。 2、選擇悲觀鎖策略,還是樂觀鎖策略,這主要是由應用和業務需求來確定的。如果你的應用和業務經常會出現從我看到要修改的記錄的...
oracle 樂觀鎖和悲觀鎖詳細教程
詳細介紹了Oracle中樂觀鎖、悲觀鎖的原理及應用,并有實例
基于ORACLE的樂觀鎖實現原理
2019獨角獸企業重金招聘Python工程師標準>>> ...
繼續訪問
Oracle之悲觀鎖和樂觀鎖_hys21的博客
根據保護的對象不同,Oracle數據庫鎖可以分為以下幾大類:DML鎖(data locks,數據鎖),用于實現并發存取并保護數據的完整性;DDL鎖(dictionary locks,字典鎖),用于保護數據庫對象的結構,如表、索引等的結構定義;內部鎖和閂(internal locks ...
oracle樂觀鎖和悲觀鎖詳細教程_oracle的樂觀鎖-Oracle文檔類資源...
內部包含oracle百度網盤下載鏈接以及密碼。 oci.dll 12版本全部 資源是從Oracle官方網站下載,已測試可用 【白雪紅葉】JAVA學習技術棧梳理思維導圖.xmind 樂觀鎖行級鎖 分布式鎖 分區排隊 一致性 一致性算法 paxos zab nwr raft gossip ...
Oracle創建悲觀鎖和樂觀鎖
為了得到最大的性能,一般數據庫都有并發機制,不過帶來的問題就是數據訪問的沖突。為了解決這個問題,大多數數據庫用的方法就是數據的鎖定。 考慮下面的情況。如果我們先查詢到數據,然后更新數據。這樣會出現這樣的情況。A線程查詢的時候,B線程也在查詢,當A線程準備更新的時候,B線程先獲得 了更新鎖,將這些行鎖定了。A只能等待B更新完。當B線程更新完釋放鎖的時候,A獲得鎖,這時A會識別出字段已經
繼續訪問
Oracle并發控制中的樂觀鎖
繼續訪問
oracle樂觀鎖悲觀鎖學習筆記(更新中)_Evaron.Z的博客
首先解釋下樂觀鎖和悲觀鎖的含義 樂觀鎖:樂觀鎖就是認為數據一般情況下不會造成沖突,所以在數據進行提交更新的時候,才會正式對數據的沖突與否進行檢測,如果發現沖突了,則返回錯誤的信息。 悲觀鎖:悲觀鎖就是對數據的沖突采取一種悲觀的...
【Oracle】樂觀鎖和悲觀鎖_◣NSD◥的博客_oracle悲觀鎖...
樂觀鎖對應于生活中樂觀的人總是想著事情往好的方向發展,悲觀鎖對應于生活中悲觀的人總是想著事情往壞的方向發展。這兩種人各有優缺點,不能不以場景而定說一種人好于另外一種人。 悲觀鎖 ...
Oracle樂觀鎖悲觀鎖
1.樂觀鎖 當處理對象狀態時為了防止沖突 例:一個下訂單的狀態status a.更新status為1購買,b取得status為1,這時a要退貨把status改為2. 這時如果b還按1的狀態去處理,發貨了。就出錯了。 正確的做法為: 當b發貨時,為了處理并發臟讀,需要先根據原status狀態去更新status為3訂單處理中 int res = update...
繼續訪問
【轉】 Oracle中樂觀鎖定的四種實現方式
<br />Oracle中樂觀鎖定的四種實現方式<br /> <br />轉自 買粉絲://買粉絲.blogjava.買粉絲/lihao336/archive/2009/09/04/293934.買粉絲<br /> 更新前在應用中存儲所要操作行的“前映像”,更新時使用存儲的舊記錄來判斷當前值是否已經改變; 使用一個特殊的列,這個列由一個數據庫觸發器或應用程序代碼維護,可以告訴我們記錄的 “版本”; 使用一個校驗和或散列值,這是使用原來的數據計算得出的; 使用新增的 Oracle 10g 特性 ORA_R
繼續訪問
oracle的悲觀鎖和樂觀鎖
目錄 1 悲觀鎖 1.1 單表 for update 1.2 關聯表for update 1.3 解除for update 鎖的占用 1.4 悲觀鎖缺點 2 樂觀鎖 2.1 比對法 2.2 版本戳 2.3 timestamp型 2.4 例子Demo 問select *from person for update或update perso...
繼續訪問
Oracle的悲觀鎖和樂觀鎖
為了得到最大的性能,一般數據庫都有并發機制,不過帶來的問題就是數據訪問的沖突。為了解決這個問題,大多數數據庫用的方法就是數據的鎖定。 數據的鎖定分為兩種方法,第一種叫做悲觀鎖,第二種叫做樂觀鎖。什么叫悲觀鎖呢,悲觀鎖顧名思義,...
繼續訪問
oracle鎖機制之悲觀鎖與樂觀鎖以及for update用法
目錄 1 悲觀鎖 1.1 單表 for update 1.2關聯表for update 1.3 悲觀鎖缺點 2樂觀鎖 2.1 比對法 2.2版本戳 2.3timestamp型 2.4 例子Demo 1 悲觀鎖 所謂的悲觀鎖:顧名思義,就是很悲觀,每次去拿數據的時候都認為別人會修改,所以每次拿數據的時候都會上鎖。這樣別人拿數據的時候就要等待直到鎖的釋放。 數據庫行級...
繼續訪問
oracle的樂觀鎖和悲觀鎖
一、問題引出 ① 假設當當網上用戶下單買了本書,這時數據庫中有條訂單號為001的訂單,其中有個status字段是’有效’,表示該訂單是有效的; ② 后臺管理人員查詢到這條001的訂單,并且看到狀態是有效的; ③ 用戶發現下單的時候下錯了,于是撤銷訂單,假設運行這樣一條SQL: update order_table set status = ‘取消’ whe
繼續訪問
Oracle鎖定:悲觀與樂觀鎖詳解
Oracle數據庫悲觀鎖與樂觀鎖是本文我們主要要介紹的內容。有時候為了得到最大的性能,一般數據庫都有并發機制,不過帶來的問題就是數據訪問的沖突。為了解決這個問題,大多數數據庫用的方法就是數據的鎖定…… 以下是代碼片段: select*fromtestwhereid=10也就是沒有for update這種鎖定數據的語句的話,就不會造成阻塞了。另外一種情況,就是當數據庫數據被鎖定的時候,也
繼續訪問
樂觀鎖與悲觀鎖——解決并發問題
引言 為什么需要鎖(并發控制)? 在多用戶環境中,在同一時間可能會有多個用戶更新相同的記錄,這會產生沖突。這就是著名的并