丟失更新的解決方案(樂觀鎖 悲觀鎖)

2021-09-02 19:51:09 字數 811 閱讀 5004

丟失更新: 當兩個事物或多個事務都更新了同一條資料,但是這些事務彼此之間都不知道其他事務進行的修改,因此第二個更改覆蓋了第一次的更改,說白了,就是事務a還沒有提交之後,但是這個時候事務b更新了資料,那麼事務a就丟失更新了。

解決方案: 樂觀鎖+悲觀鎖

悲觀鎖: 資料庫的一種鎖機制,悲觀鎖分成兩種,分別是共享鎖和排它鎖

新增共享鎖方式:select * from account lock in share mode ;

新增排它鎖方式:select * from account for update;

下面說一下共享鎖: 共享鎖就是,例如 我在客戶端a 給資料c 新增了共享鎖,此時我在客戶端b只能新增共享鎖進行檢視,沒有修改的權利,如果我想要在客戶端b進行修改,我只能在a處commit才能進行修改。

下面說一下排它鎖:排它鎖就是我在客戶端a 給資料c新增了排它鎖,那麼我在客戶端b只能在客戶端 a commit之後,才能select資料,換句話說,只要我在客戶端b用鎖進行了查詢,那我我都需要等待acommit之後,如果此時我客戶端b不加鎖,我是可以查詢到的。這個排它鎖很像資料庫隔離級別中的最高的隔離級別。但是排它鎖是鎖住了一條資料,而排它鎖是鎖上了這條資料。

說完了悲觀鎖,那麼我們在說說樂觀鎖。

樂觀鎖:就是假設丟失更新不存在,它使用的是資料庫的字段進行加測。 例如我在我的字段中新增乙個字段,欄位的型別是 timestamp 在插入和修改時 都會自動更新為當前時間 ,我根據我的sql條件進行判斷,如果我的時間不符合,那麼我的跟新失敗。

樂觀鎖 悲觀鎖及memcached實現方案

樂觀鎖與悲觀鎖的定義不再贅述,簡單說一下我的理解。假定不會出現併發問題,只有更新資料時才檢查資料是否被鎖定。假定會出現併發問題,讀取資料時即將資料鎖定。先假定乙個場景 商品搶購。有n件商品,商品剩餘數量存在memcached裡,乙個搶購的請求過來,商品剩餘數量需減1,直到0。讀取商品剩餘數量,並獲取...

悲觀鎖與樂觀鎖以及樂觀鎖的實現

總是假設最壞的情況,每次去拿資料的時候都認為別人會修改,所以每 次在拿資料的時候都會上鎖,這樣別人想拿這個資料就會阻塞直到它拿到鎖。傳 統的關係型資料庫裡邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫 鎖等,都是在做操作之前先上鎖。顧名思義,就是很樂觀,每次去拿資料的時候都認為別人不會修改,所...

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

首先解釋下樂觀鎖和悲觀鎖的含義 樂觀鎖 樂觀鎖就是認為資料一般情況下不會造成衝突,所以在資料進行提交更新的時候,才會正式對資料的衝突與否進行檢測,如果發現衝突了,則返回錯誤的資訊。悲觀鎖 悲觀鎖就是對資料的衝突採取一種悲觀的態度,也就是說假設資料肯定會衝突,所以在資料開始讀取的時候就把資料鎖定住。再...