MySQL中的悲觀鎖

什麼是悲觀鎖

關係數據庫管理系統裏,悲觀併發控制(又名「悲觀鎖」,Pessimistic Concurrency Control,縮寫「PCC」)是一種併發控制的方法。它能夠阻止一個事務以影響其餘用戶的方式來修改數據。若是一個事務執行的操做讀某行數據應用了鎖,那只有當這個事務把鎖釋放,其餘事務纔可以執行與該鎖衝突的操做。數據庫

悲觀併發控制主要用於數據爭用激烈的環境,以及發生併發衝突時使用鎖保護數據的成本要低於回滾事務的成本的環境中。併發

簡而言之,悲觀鎖主要用於保護數據的完整性。當多個事務併發執行時,某個事務對數據應用了鎖,則其餘事務只能等該事務執行完了,才能進行對該數據進行修改操做。spa

使用場景

在商品購買場景中,當有多個用戶對某個庫存有限的商品同時進行下單操做。若採用先查詢庫存,後減庫存的方式進行庫存數量的變動,將會致使超賣的產生。code

select * from tbl_user where id=1 for update;

行鎖與表鎖

當執行 select ... for update時,將會把數據鎖住,所以,咱們須要注意一下鎖的級別。MySQL InnoDB 默認爲行級鎖。當查詢語句指定了主鍵時,MySQL會執行「行級鎖」,不然MySQL會執行「表鎖」。索引

常見狀況以下:事務

  • 若明確指明主鍵,且結果集有數據,行鎖;
  • 若明確指明主鍵,結果集無數據,則無鎖;
  • 若無主鍵,且非主鍵字段無索引,則表鎖;
  • 若使用主鍵但主鍵不明確,則使用表鎖;
相關文章
相關標籤/搜索