oracle樂觀鎖悲觀鎖學習筆記(更新中)

2021-10-23 19:38:22 字數 1415 閱讀 9675

首先解釋下樂觀鎖和悲觀鎖的含義

樂觀鎖:樂觀鎖就是認為資料一般情況下不會造成衝突,所以在資料進行提交更新的時候,才會正式對資料的衝突與否進行檢測,如果發現衝突了,則返回錯誤的資訊。

悲觀鎖:悲觀鎖就是對資料的衝突採取一種悲觀的態度,也就是說假設資料肯定會衝突,所以在資料開始讀取的時候就把資料鎖定住。

再來講講oracle如何實現樂觀鎖和悲觀鎖

悲觀鎖,體現在sql上主要通過select for update和select for update nowait兩種方式:

執行select *** for update操作時,資料會被鎖定,只有執行comit或rollover才會釋放

執行select *** for update nowait操作時,資料也會被鎖定,其他人訪問時或返回ora-00054錯誤,內容是資源正忙,需要採取相應的業務措施進行處理。

樂觀鎖,有3種常用的做法來實現:

第一種就是在資料取得的時候把整個資料都copy到應用中,在進行提交的時候比對當前資料庫中的資料和開始的時候更新前取得的資料。當發現兩個資料一模一樣以後,就表示沒有衝突可以提交,否則則是併發衝突,需要去用業務邏輯進行解決。

第二種樂觀鎖的做法就是採用版本戳,這個在hibernate中得到了使用。採用版本戳的話,首先需要在你有樂觀鎖的資料庫table上建立乙個新的column,比如為number型,當你資料每更新一次的時候,版本數就會往上增加1。比如同樣有2個session同樣對某條資料進行操作。兩者都取到當前的資料的版本號為1,當第乙個session進行資料更新後,在提交的時候檢視到當前資料的版本還為1,和自己一開始取到的版本相同。就正式提交,然後把版本號增加1,這個時候當前資料的版本為2。當第二個session也更新了資料提交的時候,發現資料庫中版本為2,和一開始這個session取到的版本號不一致,就知道別人更新過此條資料,這個時候再進行業務處理,比如整個transaction都rollback等等操作。在用版本戳的時候,可以在應用程式側使用版本戳的驗證,也可以在資料庫側採用trigger(觸發器)來進行驗證。不過資料庫的trigger的效能開銷還是比較的大,所以能在應用側進行驗證的話還是推薦不用trigger。

第三種做法和第二種做法有點類似,就是也新增乙個table的column,不過這次這個column是採用timestamp型,儲存資料最後更新的時間。在oracle9i以後可以採用新的資料型別,也就是timestamp with time zone型別來做時間戳。這種timestamp的資料精度在oracle的時間型別中是最高的,精確到微秒(還沒與到納秒的級別),一般來說,加上資料庫處理時間和人的思考動作時間,微秒級別是非常非常夠了,其實只要精確到毫秒甚至秒都應該沒有什麼問題。和剛才的版本戳類似,也是在更新提交的時候檢查當前資料庫中資料的時間戳和自己更新前取到的時間戳進行對比,如果一致則ok,否則就是版本衝突。如果不想把**寫在程式中或者由於別的原因無法把**寫在現有的程式中,也可以把這個時間戳樂觀鎖邏輯寫在trigger或者儲存過程中。

oracle 悲觀鎖 樂觀鎖

為了得到最大的效能,一般資料庫都有併發機制,不過帶來的問題就是資料訪問的衝突。為了解決這個問題,大多數資料庫用的方法就是資料的鎖定。資料的鎖定分為兩種方法,第一種叫做悲觀鎖,第二種叫做樂觀鎖。什麼叫悲觀鎖呢,悲觀鎖顧名思義,就是對資料的衝突採取一種悲觀的態度,也就是說假設資料肯定會衝突,所以在資料開...

Oracle 樂觀鎖 悲觀鎖

oracle有悲觀鎖也有樂觀鎖。悲觀鎖比較安全一些,可以防止丟失更新,但是就是互相等待,影響效率。一般會用樂觀鎖,即開始操作時,樂觀的認為資料不會被其他人更改,直到提交時才加鎖檢查。比如在操作的表上加一列,儲存個時間戳,提交時檢查是不是最新的。不過樂觀鎖失敗的可能性比較大。樂觀鎖,大多是基於資料版本...

oracle 鎖 悲觀鎖與樂觀鎖

總結於ocl程式設計藝術 經常發生的錯誤錯誤 更新丟失,舊資料更新了最新的資料。解決問題的方法 在oracle中看好悲觀鎖 取決於oracle鎖開銷小,高併發 但在其他的資料庫已deprecated 悲觀鎖 在使用者有意執行更新等dml操作之前,就在行上加鎖for update nowait 悲觀鎖...