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
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/74687.html
標籤:MySQL
上一篇:mysql基本語法
下一篇:MySQL 多表查詢
