mysql悲觀鎖

悲觀鎖與樂觀鎖是兩種常見的資源併發鎖設計思路,也是併發編程中一個很是基礎的概念。mysql

悲觀鎖(Pessimistic Lock)

悲觀鎖的特色是先獲取鎖,再進行業務操做,即「悲觀」的認爲獲取鎖是很是有可能失敗的,所以要先確保獲取鎖成功再進行業務操做。一般所說的「一鎖二查三更新」即指的是使用悲觀鎖。一般來說在數據庫上的悲觀鎖須要數據庫自己提供支持,即經過經常使用的select … for update操做來實現悲觀鎖。當數據庫執行select for update時會獲取被select中的數據行的行鎖,所以其餘併發執行的select for update若是試圖選中同一行則會發生排斥(須要等待行鎖被釋放),所以達到鎖的效果。select for update獲取的行鎖會在當前事務結束時自動釋放,所以必須在事務中使用。sql

這裏須要注意的一點是不一樣的數據庫對select for update的實現和支持都是有所區別的,例如oracle支持select for update no wait,表示若是拿不到鎖馬上報錯,而不是等待,mysql就沒有no wait這個選項。另外mysql還有個問題是select for update語句執行中全部掃描過的行都會被鎖上,這一點很容易形成問題。所以若是在mysql中用悲觀鎖務必要肯定走了索引,而不是全表掃描。數據庫

 

使用例子編程

1.悲觀鎖須要等待提交commit後才能夠執行併發

set autocommit = 0;
BEGIN;
SELECT * FROM `fook_business` where id = 1 FOR UPDATE;
UPDATE `fook_business` set `areas_id` = 2 where id = 1;
oracle

 

2.然後手動更新 id=1 這條數據,看到更新失敗,因為 id=1 這條被鎖住了高併發

UPDATE `fook_business` set `areas_id` = 3 where id = 1;spa

3.commit提交成功設計

 

更新庫存時,用mysql鎖解決高併發問題的:https://mp.weixin.qq.com/s/gM_YT669SjJycflXTb_eBQblog

相關文章
相關標籤/搜索