發表文章

目前顯示的是 5月, 2016的文章

MySQL InnoDB鎖定的那些事

Shared and Exclusive Locks InnoDB標準是使用row-level鎖定,其中又有分2種鎖定類別 shared(S) locks和exclusive(X) locks shared(S) lock允許交易持有讀取行的鎖 exclusive(X) lock允許交易持有更新或刪除行的鎖 如果今天有筆交易T1持有s鎖在資料行r,此時有另一個交易T2也要對資料行r進行鎖定時,情況如下: 如果T2也是使用S鎖定則可立即執行,此時T1和T2對資料行r同時擁有s鎖定。 如果T2是使用 X 鎖定,則無法立即執行 另外,如果今天T1持有X鎖在資料行r,此時T2要對資料行r進行S鎖或X鎖時,則無法立即執行,須等到T1解除鎖定行T2才能對資料行r進行鎖定。 Intention Locks InnoDB支援多粒度鎖定允許row-level鎖定和整表鎖定共存於同張資料表中,為實現多粒度鎖定會額外使用一稱為intention locks的鎖定,此意圖鎖在InnoDB資料表中為table-level lock,用來指示此交易在資料表中的某行之後會使用哪種類型的鎖定(Shared或Exclusive),它也有兩種鎖定類型: Intention shared (IS):交易T意圖在資料表a各別資料行上持有S鎖 Intention exclusive (IX):交易T意圖在某些資料行上持有X鎖 例如:SELECT ... LOCK IN SHARE MODE會設定IS鎖,SELECT ... FOR UPDATE設定IX鎖。 Intention Lock的協議如下: 一個交易在資料表a中的一資料行獲得S鎖之前,必須先取得a資料表的IS鎖或更強的鎖 一個交易在獲得一資料行的X鎖之前,必須先取得a資料表的IX鎖 總結如下表: X IX S IS X 衝突 衝突 衝突 衝突 IX 衝突 相容 衝突 相容 S 衝突 衝突 相容 相容 IS 衝突 相容 相容 相容 在相容的情況下允許在現有的鎖中被授予其他的鎖定,而衝突的情況下則需等待前一個鎖定釋放後,才能對此進行鎖定,否則會發生死鎖或錯誤。 因此,意圖鎖定不會阻止除全表請求任何東西(例如,LOCK TABLES... WRITE),其主要目的是