MySQL InnoDB存儲引擎:外鍵與鎖


MySQL InnoDB存儲引擎:外鍵與鎖


外鍵主要用於引用完整性的約束檢查在InnoDB存儲引擎中,對於一個外鍵列,如果沒有顯式地對這個列加索引,InnoDB存儲引擎會自動對其加一個索引,因為這樣可以避免表鎖。 這比Oracle數據庫做得好,Oracle數據庫不會自動添加索引,用戶必須自己手動添加,這也導致了Oracle數據庫中可能產生死鎖。

對於外鍵值的插入或更新,首先需要檢查父表中的記錄,既SELECT父表。但是對於父表的SELECT操作,不是使用一致性非鎖定讀的方式,因為這會發生數據不一致的問題,因此這時使用的是SELECT…LOCK IN SHARE MODE方式,即主動對父表加一個S鎖。如果這時父表上已經這樣加X鎖,子表上的操作會被阻塞,如下:


MySQL InnoDB存儲引擎:外鍵與鎖

在上述的例子中,兩個會話中的事務都沒有進行COMMIT或ROLLBACK操作,而會話B的操作會被阻塞。這是因為 id為3的父表在會話 A中已經加了一個X鎖,而此時在會話 B中用戶又需要對父表中 id為3的行加一個 S鎖,這時 INSERT的操作會被阻塞。設想如果訪問父表時,使用的是一致性的非鎖定讀,這時Session B會讀到父表有id=3的記錄,可以進行插入操作。但是如果會話A對事務提交了,則父表中就不存在id為3的記錄。數據在父、子表就會存在不一致的情況。

博主


MySQL InnoDB存儲引擎:外鍵與鎖


MySQL InnoDB存儲引擎:外鍵與鎖


分享到:


相關文章: