MySQL 鎖的學習

2021-10-16 23:52:32 字數 2005 閱讀 9716

read uncommitted :髒讀、不可重複讀、幻讀都可能發生。

read committed:隔離級別下,不可重複讀、幻讀可能發生,髒讀不可以發生。

repeatable read:隔離級別下,幻讀可能發生,髒讀和不可重複讀不可以發生。

serializable:隔離級別下,上述問題都不可以發生。

mysql在repeatable read隔離級別實際上就已經解決了幻讀問題。

解決髒讀、不可重複讀、幻讀

我們說過普通的select語句在read committed和repeatable read隔離級別下會使用到mvcc讀取記錄。在read committed隔離級別下,乙個事務在執行過程中每次執行select操作時都會生成乙個readview,readview的存在本身就保證了事務不可以讀取到未提交的事務所做的更改,也就是避免了髒讀現象;repeatable read隔離級別下,乙個事務在執行過程中只有第一次執行select操作才會生成乙個readview,之後的select操作都復用這個readview,這樣也就避免了不可重複讀和幻讀的問題。

表級別的鎖

lock tables *** read:這是加表級共享鎖 

lock tables *** write:這是加表級獨佔鎖

系統預設加的mdl,當對乙個表做增刪改查操作的時候,加mdl讀鎖;當要對錶做結構變更操作的時候,加mdl寫鎖。

所以改表結構要注意點,會阻塞這個表的所有操作

其實走mvcc基本都夠了沒必要加鎖。除非特定的業務需要獨佔某條資料。

鎖定語句
對讀取的記錄加s鎖: 共享鎖相互不互斥

select ... lock in share mode;

對讀取的記錄加x鎖: 排它鎖與鎖都互斥

select ... for update;

增刪改的語句或多或少在獲取資料時或者在更新記錄時都是會獲取x鎖的,具體細化看後面

降低鎖時間

在innodb事務中,行鎖是在需要的時候才加上的,但並不是不需要了就立刻釋放,而是要等到事務結束時才釋放。這個就是兩階段鎖協議。

從顧客a賬戶餘額中扣除電影票價;

給影院b的賬戶餘額增加這張電影票價;

記錄一條交易日誌。

根據兩階段鎖協議,不論你怎樣安排語句順序,所有的操作需要的行鎖都是在事務提交的時候才釋放的。所以,如果你把語句2安排在最後,比如按照3、1、2這樣的順序,那麼影院賬戶餘額這一行的鎖時間就最少。這就最大程度地減少了事務之間的鎖等待,提公升了併發度。

死鎖檢測策略

間隙鎖與臨鍵鎖(next-key lock)

mvcc不能完美的解決幻讀問題

我們都知道 幻讀是資料條數的改變,那意味著表裡面增加記錄的鎖時未知的。即使把所有的記錄都加上鎖,還是阻止不了新插入的記錄

這樣,當你執行 select * from t where d=5 for update的時候,就不止是給資料庫中已有的6個記錄加上了行鎖,還同時加了7個間隙鎖。這樣就確保了無法再插入新的記錄。

跟間隙鎖存在衝突關係的,是「往這個間隙中插入乙個記錄」這個操作。間隙鎖之間都不存在衝突關係

間隙鎖是在可重複讀隔離級別下才會生效的,不可重複讀那沒必要加鎖了

間隙鎖和行鎖合稱next-key lock:每個next-key lock是前開後閉區間。

也就是說,我們的表t初始化以後。如果用select * from t for update要把整個表所有記錄鎖起來,

就形成了7個next-key lock,分別是 (-∞,0]、(0,5]、(5,10]、(10,15]、(15,20]、(20, 25]、(25, +suprenum]。

可以看看之前文章間隙鎖

間隙鎖案例、規則、死鎖

Mysql 學習(五)MySQL的全域性鎖和表鎖

1.全域性鎖就是對整個資料庫例項加鎖 2.mysql 提供了乙個加全域性讀鎖的方法,命令是flush tables with read lock ftwrl 3.當你需要讓整個庫處於唯讀狀態的時候,可以使用這個命令,之後其他執行緒的以下語句會被阻塞 資料更新語句 資料的增刪改 資料定義語句 包括建表...

Mysql 學習(六)MySQL的行鎖

當併發系統中不同執行緒出現迴圈資源依賴,涉及的執行緒都在等待別的執行緒釋放資源時,就會導致這幾個執行緒都進入無限等待的狀態,稱為死鎖 例如 事務a 事務bbegin update a set t t 1 where id 1 begin update a set t t 1 where id 2 u...

MySQL學習筆記 鎖

macbook pro mysql技術內幕innodb儲存引擎 第二版 資料庫中最大的難點 一方面需要最大程度地利用資料庫的併發訪問,另外一方面還要確保每個使用者能以一致的方式讀取和修改資料。因此就有了鎖的機制。q innodb儲存引擎為什麼乙個鎖和多個鎖的開銷是相同。a lock的物件是事務,用來...