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時,通常都需要遍歷整張表來確定是否有鎖住行。