樂觀所和悲觀鎖策略
- 悲觀鎖:在讀取數據時鎖住那幾行,其他對這幾行的更新需要等到悲觀鎖結束時才能繼續 。
- 樂觀所:讀取數據時不鎖,更新時檢查是否數據已經被更新過,如果是則取消當前更新,一般在悲觀鎖的等待時間過長而不能接受時我們才會選擇樂觀鎖。
在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語句的問題;為了克服這個問題,可以考慮使用按時間戳或者限制重入次數的辦法。