介紹MySQL鎖的一些內容,包括鎖的粒度、表鎖、行級鎖、死鎖等內容 ...
1. 鎖的粒度
在MySQL中,只要有多個請求需要在同一時刻修改數據,都會產生併發控制的問題。而鎖的作用可以保證同一資源能被某個請求唯一使用。
加鎖是會消耗系統資源的,包括獲得鎖、檢查鎖是否已解除、釋放鎖等等操作,都會增加系統的開銷。
為了平衡鎖的開銷和數據的安全性,MySQL對鎖的粒度提供了多種方式,主要分為表鎖和行級鎖。
表鎖(table lock):指在加鎖時鎖定整張表。
行級鎖(row lock):指在加鎖時鎖定某一行。
2. 共用鎖和排他鎖
在InnoDB存儲引擎中,鎖的類型通常分為共用鎖和排他鎖。
共用鎖(shared lock):也叫讀鎖(read lock),指多個請求在同一時刻可以同時讀取同一個資源,互相不幹擾。
排他鎖(exclusive lock):也叫寫鎖(write lock)。一個寫鎖會阻塞其他的寫鎖和讀鎖,這樣能確保一定的時間內,只有一個請求能執行寫入操作,防止其他請求讀取或寫入同一資源。
示例1:
事務T1對某一行R1進行了共用鎖的加鎖操作時,事務T2也可以對此行R1進行共用鎖的加鎖操作,但事務T2不可以對此行R1進行排他鎖操作。
示例2:
事務T1對某一行R1進行了排他鎖的加鎖操作時,事務T2不能對此行R1進行任一類型的鎖的請求,事務T2必須等待事務T1釋放對行R1的鎖定才能進行後續的加鎖操作。
3. 死鎖
死鎖是指多個事務在同一個資源上互相占用,並請求鎖定對方占用的資源,從而導致惡性迴圈的現象。比如多個事務以不同的順序鎖定相同的資源就會產生死鎖。
示例:
事務T1按順序修改R1和R2行,事務T2按順序修改R2和R1行,當2個事務同時執行,在執行第2行時發現此行都已經被別的事務進行了排他鎖操作,就會陷入惡性迴圈中。
解決方案:
在InnoDB中的方案是將最少行級排他鎖的事務進行回滾。
4. 參考資料
Innodb中的鎖:https://dev.mysql.com/doc/refman/5.6/en/innodb-locking.html