1、介紹
悲觀鎖,正如其名,它指的是對數據被外界(包括本系統當前的其餘事務,以及來自外部系統的事務處理)修改持保守態度,所以,在整個數據處理過程當中,將數據處於鎖定狀態。悲觀鎖的實現,每每依靠數據庫提供的鎖機制(也只有數據庫層提供的鎖機制才能真正保證數據訪問的排他性,不然,即便在本系統中實現了加鎖機制,也沒法保證外部系統不會修改數據)sql
2、使用介紹
咱們舉一個項目中常見的應用場景吧。
好比有一張表 他有三個字段。id表明商品id ,name表明商品名字,count表明該商品數量。 咱們爲了顯示搶購的時候顯示該商品還剩餘多少件。
咱們會手動的上鎖。鎖住id爲1的商品。好比id爲1的商品名字是某型號的mac pro。count表明了該商品還剩餘多少件。當併發量很大的狀況下,商品數量自減的值多是不許確的。 因此當咱們在一個事務中對count字段進行修改的時候,其餘的事務應該是隻能讀取指定id的count值。而不能寫入或者update。這個時候for update的做用就是在此刻體現的。 數據庫
好比說sql是這樣的:
start transaction ;
select * from table_name where id =1 for update ;
update table_name set count = count - 1 where id= 1;併發
此時若是另外一個事務也想執行相似的操做:
start transaction ;
select * from table_name where id =1 for update ;
//下面的這行sql會等待,直到上面的事務回滾或者commit才獲得執行。
update table_name set count = count - 1 where id= 1;spa
注意:
當選中某一個行的時候,若是是經過主鍵id選中的。那麼這個時候是行級鎖。 其餘的行仍是能夠直接insert 或者update的。事務
若是是經過其餘的方式選中行,或者選中的條件不明確包含主鍵。這個時候會鎖表。其餘的事務對該表的任意一行記錄都沒法進行插入或者更新操做。只能讀取。it