SpringBoot 悲觀鎖 與 樂觀鎖


樂觀所和悲觀鎖策略

  • 悲觀鎖:在讀取數據時鎖住那幾行,其他對這幾行的更新需要等到悲觀鎖結束時才能繼續 。
  • 樂觀所:讀取數據時不鎖,更新時檢查是否數據已經被更新過,如果是則取消當前更新,一般在悲觀鎖的等待時間過長而不能接受時我們才會選擇樂觀鎖。

在SELECT 的讀取鎖定主要分為兩種方式:

  • SELECT ... LOCK IN SHARE MODE 

  • SELECT ... FOR UPDATE

這兩種方式在事務(Transaction) 進行當中SELECT 到同一個數據表時,都必須等待其它事務數據被提交(Commit)后才會執行。

而主要的不同在於LOCK IN SHARE MODE 在有一方事務要Update 同一個表單時很容易造成死鎖。

簡單的說,如果SELECT 后面若要UPDATE 同一個表單,最好使用SELECT ... UPDATE。

需要注意的是:由於InnoDB 預設是Row-Level Lock,所以只有「明確」的指定主鍵,MySQL 才會執行Row lock (只鎖住被選取的數據) ,否則MySQL 將會執行Table Lock (將整個數據表單給鎖住)。

樂觀鎖機制:

  • 樂觀鎖是一種不使用數據庫鎖的機制,並且不會造成線程的阻塞,只是采用多版本號機制來實現。但是,因為版本號的沖突造成了請求失敗的概率劇增,所以這時往往需要通過重入的機制將請求失敗的概率降低,多次的重入會帶來過多執行SQL語句的問題;為了克服這個問題,可以考慮使用按時間戳或者限制重入次數的辦法。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM