1. 程式人生 > >SpringBoot 悲觀鎖 與 樂觀鎖

SpringBoot 悲觀鎖 與 樂觀鎖

mysq 主鍵 evel mys 更新 mysql 悲觀鎖 sql transacti

樂觀所和悲觀鎖策略

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

在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 (將整個數據表單給鎖住)。

SpringBoot 悲觀鎖 與 樂觀鎖