悲觀鎖、樂觀鎖、排它鎖、共享鎖、表級鎖、行級鎖,死鎖?
悲觀鎖:每次去拿資料的時候都認為別人會修改,所以每次在拿資料的時候都會上鎖,這樣別人想拿這個資料就會block直到它拿到鎖,適用于寫為居多的場景下,比如行鎖,表鎖等,讀鎖,寫鎖,syncronized實作的鎖等,sql中實作悲觀鎖,使用for update對資料加鎖,例如:select num from goods where id = 1 for update;
樂觀鎖:每次去拿資料的時候都認為別人不會修改,所以不會上鎖,但是在更新的時候會判斷一下在此期間別人有沒有去更新這個資料,在表中增加一個版本(version)或時間戳(timestamp)來實作,適用于讀為居多的場景下,樂觀鎖適用于多讀的應用型別,這樣可以提高吞吐量,
作業流程:
獲取當前資料版本
更新操作版本號+1
提交更新時,獲取版本號
比較提交時的版本號與第一次獲取的版本號,如果一致,那么認為資源是最新的,可以更新
否則回滾或者拋出例外
案例:
事務一開啟,男柜員先執行讀操作,取出金額和版本號,執行寫操作,此時金額改為 120,版本號為1,事務還沒有提交
事務二開啟,女柜員先執行讀操作,取出金額和版本號,執行寫操作,此時金額改為 50,版本號變為 1,事務未提交
現在提交事務一,金額改為 120,版本變為1,提交事務,理想情況下應該變為 金額 = 50,版本號 = 2?
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/274116.html
標籤:其他
上一篇:太原理工大學軟體學院 資料庫實驗 實驗二(2021.4.8)
下一篇:iOS Predicate Format String Syntax 【NSPredicate在正則運算式的應用】
