1. 程式人生 > >Oracle的悲觀鎖和樂觀鎖---摘抄

Oracle的悲觀鎖和樂觀鎖---摘抄

1、無論是選擇悲觀鎖策略,還是樂觀鎖策略。如果一個物件被上了鎖,那麼該物件都會受這個鎖的控制和影響。如果這個鎖是個排它鎖,那麼其它會話都不能修改它。

2、選擇悲觀鎖策略,還是樂觀鎖策略,這主要是由應用和業務需求來確定的。如果你的應用和業務經常會出現從我看到要修改的記錄的值,到我修改完成該記錄這個時間段內,該記錄有較大概率被其它會話所修改。換句話說就是,在我真正去做出修改時,這個記錄的值很可能已經與我當初看到的不同了。那麼這時,採取悲觀鎖策略,也許是更好的。而採取悲觀鎖策略的一個典型操作就是 select ... for undate。通過這種操作,使得從我一開始檢視該記錄起,這條記錄就被上了排它鎖,不允許其它會話再對該記錄有任何修改。
相對的,如果你的業務和應用基本上很少出現這種情景,那麼選擇樂觀鎖策略也許就會更好。

3、這兩種策略的核心其實就是持有鎖的時間的起止點不同,悲觀鎖是從讀取記錄的那一刻就開始了,而樂觀鎖只從UPDATE那一刻開始;結束的點兩者是一樣的,都是發出commit或rollback命令。所以,悲觀鎖策略會使鎖的持續時間更長,而樂觀鎖的持續時間則較短。其影響就是併發。悲觀鎖的併發性低於樂觀鎖。

4、無論是採用哪種策略,都要保證資料的完整性。所以,在採用樂觀鎖策略時,是有可能出現數據的不完整。舉例來說:儲戶甲的存款餘額100元,假設在幾乎相同的時刻,發生了兩筆業務,業務1為其存入了50元,另一個業務是其網上購物消費了30元。顯然,這兩個操作結束後,甲的存款餘額應為120元(100+50-30)。但我們設想一下在資料庫層面,可能出現這種情況,當其在銀行櫃檯存入50元時,銀行操作員收到了甲存入的50元現金,並通過 select 語句看到甲的當前餘額為100元(其發出的指令是下面的語句:
select 餘額 
   from 存款餘額表
where 儲戶帳號=儲戶甲的銀行帳號;)

,接著,發出指令 
update 存款餘額表
      set 餘額=150
    where 儲戶帳號=儲戶甲的銀行帳號;

但就在其看到甲的餘額為100元,到其修改甲的餘額為150這期間,甲在網上的消費行為導致交易系統已經將甲的餘額變成了70元(100-30)並提交了。當銀行員工發出的指令也被提交後,甲的餘額變成了150元,相當於甲網上消費的行為沒有產生任何扣款。這顯然是不正確的,更是要避免出現的。
如果這套系統採用的是悲觀鎖策略,那麼在從銀行員工檢視甲當前餘額的那一個時刻起(這時查詢的指令就會是:
select 餘額 
   from 存款餘額表
where 儲戶帳號=儲戶甲的銀行帳號 for update;)
該記錄就已經被鎖定了,這時甲網上消費的行為導致的交易系統從甲的帳戶中扣減的操作就會處於等待狀態。直至銀行員工提交了相關指令,交易系統才能去扣減甲的錢款。這樣,就可以確保甲的帳戶餘額是正確的。
悲觀鎖的策略顯然可以保證業務的正確性和完整性。但再設想一下,如果甲在存款時,銀行員工內急,或者儲戶甲說等一等,我要考慮一下是否再多存一些。那麼,銀行員工的操作就不會提交,這時網上交易系統對甲帳戶的扣款操作就會一直處於等待狀態,或者在等待一定時間後,返回一個扣款失敗的提示。這對於系統的效率和客戶來說,都不是一個好的體驗。

5、因為考慮到樂觀鎖策略可以產生的這種問題,所以,我們在設計應用時,可以採取一些其它方法來避免上述情況的發生。其思想就是在真正提交時,確認要修改的資料沒有變化過。主要的方法如下:
(1)、更新時帶入原始的資料。
     update 存款餘額表
      set 餘額=150
    where 儲戶帳號=儲戶甲的銀行帳號 and 餘額=100;
(2)、在記錄上增加修改的時間戳(也可利用ora_rowscn偽列)。即在事務開始時,獲取該記錄的時間戳,修改時,校驗該時間戳,若一致則修改。

6、其實,我上面舉的這個例子,如果在業務設計時,選擇更新指令為
update 存款餘額表
      set 餘額=餘額+50
    where 儲戶帳號=儲戶甲的銀行帳號;
那麼,即使是在樂觀鎖策略的情況下,依然可以保證資料的正確性和完整性。

---引自 http://www.itpub.net/forum.php?mod=viewthread&tid=1928001

相關推薦

Oracle悲觀樂觀---摘抄

1、無論是選擇悲觀鎖策略,還是樂觀鎖策略。如果一個物件被上了鎖,那麼該物件都會受這個鎖的控制和影響。如果這個鎖是個排它鎖,那麼其它會話都不能修改它。2、選擇悲觀鎖策略,還是樂觀鎖策略,這主要是由應用和業務需求來確定的。如果你的應用和業務經常會出現從我看到要修改的記錄的值,到我修改完成該記錄這個時間段內,該記錄

MySQL數據庫同步之悲觀樂觀

我們 測試 http 鎖定 以及 再次 否則 即使 name 測試需要:本地開兩個測試窗口 悲觀鎖 悲觀鎖它指的是對數據被外界(包括本系統當前的其他事務,以及來自外部系統的事務處理)修改持保守態度,在整個數據處理過程中,將數據處於鎖定狀態。悲觀鎖的實現,往往依靠數據庫提供的

悲觀樂觀

mysql鎖有兩種機制:悲觀鎖和樂觀鎖。悲觀鎖 悲觀鎖,鎖如其名,他對世界是悲觀的,他認為別人訪問正在改變的數據的概率是很高的,所以從數據開始更改時就將數據鎖住,直到更改完成才釋放。一個典型的倚賴數據庫的悲觀鎖調用: select * from account where name=”Erica”

Hibernate 再接觸 悲觀樂觀

package his sts nsa comm pen hibernate UNC ann 為什麽取1248 二進制 CRUD 移位效率高 在並發和效率選擇一個平衡點 一般不會考慮幻讀 因為我們不會再一個事務裏查詢兩次,(只能設置為seralizable) 悲觀鎖

hibernate機制有什麼用?Hibernate的悲觀樂觀機制

有些業務邏輯在執行過程中要求對資料進行排他性的訪問,於是需要通過一些機制保證在此過程中資料被鎖住不會被外界修改,這就是所謂的鎖機制。 Hibernate支援悲觀鎖和樂觀鎖兩種鎖機制。悲觀鎖,顧名思義悲觀的認為在資料處理過程中極有可能存在修改資料的併發事務(包括本系統的其他事務或來自外部系統的

深入瞭解探索資料庫的悲觀樂觀

 在資料庫的鎖機制中介紹過,資料庫管理系統(DBMS)中的併發控制的任務是確保在多個事務同時存取資料庫中同一資料時不破壞事務的隔離性和統一性以及資料庫的統一性。 樂觀併發控制(樂觀鎖)和悲觀併發控制(悲觀鎖)是併發控制主要採用的技術手段。 無論是悲觀鎖還是樂觀鎖,都是人們定義出來

資料庫的悲觀樂觀

一 :悲觀鎖(Pessimistic Locking)  悲觀鎖,正如其名,它指的是對資料被外界(包括本系統當前的其他事務,以及來自外部系統的事務處理)修改持保守態度,因此,在整個資料處理過程中,將資料處於鎖定 狀態。悲觀鎖的實現,往往依靠資料庫提供的鎖機制(也只有資料庫層提

悲觀樂觀的簡單瞭解

悲觀鎖:悲觀鎖是由資料庫提供的,用於防止資料庫併發控制造成的異常。   實現悲觀鎖:在要進行加鎖的事務中的sql語句末加上 for update。   悲觀鎖正如他的名字一樣,比較悲觀,他在加鎖過程中,不允許任何事務進行查詢或增刪改。       樂觀鎖:樂觀鎖是由邏

java多執行緒系列3:悲觀樂觀

1.悲觀鎖和樂觀鎖的基本概念 悲觀鎖: 總是認為當前想要獲取的資源存在競爭(很悲觀的想法),因此獲取資源後會立刻加鎖,於是其他執行緒想要獲取該資源的時候就會一直阻塞直到能夠獲取到鎖; 在傳統的關係型資料庫中,例如行鎖、表鎖、讀鎖、寫鎖等,都用到了悲觀鎖。還有java中的同步關鍵字Synchroniz

hibernate面試題之機制有什麼用?簡述Hibernate的悲觀樂觀機制

有些業務邏輯在執行過程中要求對資料進行排他性的訪問,於是需要通過一些機制保證在此過程中資料被鎖住不會被外界修改,這就是所謂的鎖機制。 Hibernate支援悲觀鎖和樂觀鎖兩種鎖機制。悲觀鎖,顧名思義悲觀的認為在資料處理過程中極有可能存在修改資料的併發事務(包括本

資料庫悲觀樂觀使用Mybatis

以下是轉載的oracle和Mysql兩種資料庫悲觀鎖和樂觀鎖機制及樂觀鎖實現方式: 一、Oracle Oracle資料庫悲觀鎖與樂觀鎖是本文我們主要要介紹的內容。有時候為了得到最大的效能,一般資料庫都有併發機制,不過帶來的問題就是資料訪問的衝突。為了解決這個問題,大多數資

synchronizedlock的區別;悲觀樂觀的區別

synchronized和lock的區別:  1.用法不一樣。synchronized既可以加在方法上,也可以載入特定的程式碼塊上,括號中表示需要鎖的物件。而Lock需要顯示地指定起始位置和終止位置。synchronzied是託管給jvm執行的,Lock鎖定是通過程式碼實現

Spring Boot+SQL/JPA實戰悲觀樂觀

最近在公司的業務上遇到了併發的問題,並且還是很常見的併發問題,算是低階的失誤了。由於公司業務相對比較複雜且不適合公開,在此用一個很常見的業務來還原一下場景,同時介紹悲觀鎖和樂觀鎖是如何解決這類併發問題的。 公司業務就是最常見的“訂單+賬戶”問題,在解決完公司問題後,轉頭一想,我的部落格專案Fame中也有同樣

mysql悲觀樂觀

一、悲觀鎖 1、排它鎖,當事務在操作資料時把這部分資料進行鎖定,直到操作完畢後再解鎖,其他事務操作才可操作該部分資料。這將防止其他程序讀取或修改表中的資料。 2、實現:大多數情況下依靠資料庫的鎖機制實現 一般使用 select ...for update

悲觀樂觀解決事務丟失跟新問題

事務丟失更新:A,B兩個事務通過id獲取資料,name:lisi,money:1000 首先,A事務修改name,把lisi變為zhangsan,然後提交事務。此時,B事務中不受A事務的影響,即B事務中的name還是lisi,此時如果B事務改變money為2000,然後提交事務。最後資料庫的資料

redis的 悲觀樂觀的區別

悲觀鎖(Pessimistic Lock), 顧名思義,就是很悲觀,每次去拿資料的時候都認為別人會修改,所以每次在拿資料的時候都會上鎖,這樣別人想拿這個資料就會block直到它拿到鎖。傳統的關係型資料庫裡邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作

Java機制 悲觀樂觀

鎖的存在,是為了解決在併發環境下,資料的一致性問題。鎖機制保證了程式不會出現,髒讀,衝突等情況。 先介紹下,悲觀鎖和樂觀鎖的基本描述。 悲觀鎖 正如其名,當出現在多使用者的併發環境中時, 它對資料出現併發衝突,持保守態度(悲觀)。它假定一定出現衝突,所以在

悲觀樂觀的區別及應用場景

資料的鎖定分為兩種,第一種叫作悲觀鎖,第二種叫作樂觀鎖。 1、悲觀鎖,就是對資料的衝突採取一種悲觀的態度,也就是說假設資料肯定會衝突,所以在資料開始讀取的時候就把資料鎖定住。【資料鎖定:資料將暫時不會得到修改】 2、樂觀鎖,認為資料一般情況下不會造成衝突,所以在資料進行提交

小議“悲觀樂觀”的原理、場景、示例

[1] 博由 前幾天與一些朋友談到這個問題,之前有一些概念的上的涉及,但是並沒有相對深入的瞭解,因此找一些資料來幫助自己理解悲觀鎖和樂觀鎖的概念理解、場景、然後通過示例來闡述樂觀鎖和悲觀鎖的實現方式。 [2] 摘要 本文將從三個方面來闡

悲觀樂觀的區別應用場景

悲觀鎖(Pessimistic Lock), 顧名思義,就是很悲觀,每次去拿資料的時候都認為別人會修改,所以每次在拿資料的時候都會上鎖,這樣別人想拿這個資料就會block直到它拿到鎖。傳統的關係型資料庫裡邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操