1. 程式人生 > >MySQL技術內幕 InnoDB儲存引擎:外來鍵與鎖

MySQL技術內幕 InnoDB儲存引擎:外來鍵與鎖

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

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

在上述的例子中,兩個會話中的事務都沒有進行COMMIT或ROLLBACK操作,而會話B的操作會被阻塞。這是因為tag_id為3的父表在會話中已經加了一個X鎖,而此時在會話B中使用者又需要對父表中tag_id為3的行加一個S鎖,這時INSERT的操作會被阻塞。

本文整理自:《MySQL技術內幕 InnoDB儲存引擎
個人微信公眾號:
這裡寫圖片描述

作者:jiankunking 出處:http://blog.csdn.net/jiankunking