MySql的鎖有以下幾種形式:
1. 表級鎖;開銷小,加鎖快;不會出現死鎖;鎖定粒度大,發生鎖沖突的概率最高 ,並發度最低。MyISAM引擎屬於這種類型。
2. 行級鎖:開銷大,加鎖慢;會出現死鎖;鎖定粒度最小,發生鎖沖突概率最低,並發度也最高。InnoDB引擎屬於這種類型。
3. 頁面鎖:開銷和加鎖時間介於表鎖和行鎖之間;會出現死鎖;鎖定粒度也介於兩者之間,並發度一般。NDB屬於這種類型。
一. 表鎖的演示
MyISAM存儲引擎只支持表鎖,所以對其進行操作會存在以下情況:
1.對MyISAM表的讀操作,不會堵塞其他進程對同一表的讀請求,但會阻塞對同一表的寫請求。只有當讀鎖釋放後,才會執行其他進程的寫操作。
2.對MyISAM表的寫操作,會阻塞其他進程對同一表的讀或寫操作,只有當寫釋放後,才會執行其他進程的讀寫操作。
【示例】:
打開另一個會話:
會話2會一直等待,直到會話一鎖的釋放。
同時會話2的執行:
二. 行鎖的演示
InnoDB存儲引擎是通過給索引項加鎖來實現的,這就意味著:只有通過索引條件檢索數據,InnoDB才會使用行級鎖,否則,InnoDB將使用表鎖。
1. 行鎖
myiSAM引擎下兩個會話更新同一條記錄會響應,因為myiSAM是表鎖。<喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+PGltZyBzcmM9"http://www.2cto.com/uploadfile/Collfiles/20150529/2015052910190246.jpg" alt="\">
但在InnoDB中:
在會話2中,
此時會鎖等待。因為更新的是同一條記錄。
2. 對未加索引檢索數據
原因是通過索引條件檢索數據,InnoDB才會使用行級鎖,否則,InnoDB將使用表鎖。
3. 死鎖
這時會話1會一直等待…
會話2在進行更改會超時…
再看會話1
發生死鎖之後,InnoDB會自動檢測到,它會讓一個事務釋放鎖並回退,另一個事務則獲得鎖,繼續完成事務。死鎖是無法避免的,我們通過調整業務的邏輯來盡量減少死鎖出現的概率。