二、一生摯友redo log、binlog《死磕MySQL系列 二》
三、MySQL強人“鎖”難《死磕MySQL系列 三》
獲取MySQL各種學習資料
前言
下邊兩幅圖還熟悉吧!就是第三期文章中的前言,但上一期文章並未提及死鎖,只是引出了全局鎖、表鎖的概念。本期文章將繼續聊聊鎖的內容。
Lock wait timeout exceeded; try restarting transaction
Deadlock found when trying to get lock; try restarting transaction
一、行鎖
行鎖的鎖粒度最小,發送鎖沖突的概率最低,並發度也最高。
問題:MySQL的所有存儲引擎都支持行鎖嗎?
不是的,MySQL中只有Innodb存儲引擎才支持行鎖,其它的並不支持,MyIsam存儲引擎也只支持表鎖。
所以Myisam存儲引擎只能使用表鎖來解決並發,表鎖開銷小,加鎖快,鎖定粒度大,發生鎖沖突的概率最高,並發度最低。
問題:鎖粒度指的是什么?
這種名詞不能只記名字,需要知道其代表的含義。鎖粒度指的是加鎖的范圍。
上期文章講的全局鎖鎖的是整庫、表鎖鎖定的全表、行鎖指的是鎖定某一行或某個范圍
的數據。
問題:如何加行鎖?
Innodb存儲引擎在執行update、delete、insert語句時會隱式加排它鎖,而對於select不會加任何鎖。
同樣也可以手動加鎖。
共享鎖:select * from tableName where id = 100 lock in share more
排它鎖:select * from tableName where id = 100 for update
共享鎖、排它鎖也被稱之為讀鎖、寫鎖。讀鎖與讀鎖之間不互斥,讀鎖與寫鎖、寫鎖與寫鎖之間是互斥的。
問題:為什么要加鎖?
MySQL事務的四大特性分別是原子性、隔離性、一致性、持久性,當你了解完事務的四大特性之后就發現都是為了保證數據一致性為最終目的的。
常說一句話有人地方就有江湖,放在MySQL中是有鎖的地方就有事務。
所以說加鎖就是為了保證當事務結束后,數據庫的完整性約束不被破壞,從而確保數據一致性。
二、兩階段鎖
問題:兩階段鎖是什么?
說實話,這個名字屬實很唬人,猛然間你有沒有想到另一個名詞兩階段提交。這里回憶一下,兩階段提交是確保redo log跟binlog同時提交成功,若有一方提交失敗則回滾。
在Innodb存儲引擎中,行鎖是在需要的時候加上的,但並不是不需要了就直接釋放的,而是要等到事務結束才釋放。
案例:解釋兩階段鎖