MySQL 鎖簡述
MySql 主要的鎖可以分為幾種類型:
MyISAM與 InnoDB 都支援表級別與行級別鎖: X 鎖、 S 鎖
InnoDB的表級別鎖:IX鎖、IS 鎖
X 鎖
X 鎖又稱為排他鎖(Exclusive Locks),目的是為了保持資料一致性。主要是在進行交易事務的過程中,對於資料庫執行 X 鎖,會讓交易過程中只能讀取修改資料庫A。在鎖定過程,是以行鎖定的方式,並且是在執行鎖定時才會檢查是否有鎖。
S 鎖
S 鎖又稱為共享鎖(Share Locks)或者讀取鎖,目的是為了提升讀取效能。在交易事務進行,針對資料庫執行 S 鎖時,其他交易事務仍可以針對資料庫加上 S 鎖(但不能加入 X 鎖,也就是只能讀取,但不能新增,更新或刪除)。
當資料庫的 S 鎖釋放後,才能接續在執行 X 鎖。
IX 鎖
IX 稱為意象排他鎖。主要是資料庫交易時,針對行加上 IX,在準備加上鎖之前,才會檢查是否有衝突。
IS 鎖
IS 稱為意象共享鎖。主要是資料庫交易時,針對行加上 IS ,在準備加上鎖之前,才會檢查是否有衝突。
兼容性 | IS | IX | S | X |
---|---|---|---|---|
IS | 兼容 | 兼容 | 兼容 | 互斥 |
IX | 兼容 | 兼容 | 互斥 | 互斥 |
S | 兼容 | 互斥 | 兼容 | 互斥 |
X | 互斥 | 互斥 | 互斥 | 互斥 |
表級別鎖與行級別鎖比較
表級別鎖較為簡單,效率也較高,並且不會發生鎖死的情況,但是發生衝突的機會較大。
行級別鎖是針對指定行進行鎖住,能減少操作衝突,但是加鎖過程才會檢查是否衝突,效率較慢,且容易出現死鎖的情況。
另外,IX與IS屬於表級別鎖,只會和表級別的 X,S發生衝突,不會和行級別的 X,S衝突。
意象鎖的效率較好,如果是使用表級別X時,通常都需要遍歷整張表來確定是否有鎖住行。