2013-02-26 43 views
0

這是一個非常簡單的問題,但我真的無法在Google上找到任何有用的答案。SQL INSERT是否涉及任何讀/寫鎖?

我一直在閱讀,有讀取鎖定在SELECT和寫入鎖定UPDATE語句。但是,我試圖找出當我們插入表時是否有任何種類的LOCK?

假設是該表使用InnoDB作爲引擎。

回答

0

對於innoDB mysql使用行級鎖定。 插入時,沒有要鎖定的行,因爲您正在創建它。

+0

InnoDB在插入時確實創建了一些鎖(雖然不是「行鎖」)。 – 2013-02-26 08:18:39

+0

它跨越了我的腦海,必須有一些聰明的機制,以避免插入兩行相同的自動增量值只是沒有連接鎖...愚蠢的我 – Gustek 2013-02-26 13:52:21

4

插入時,InnoDB創建一個所謂的「間隙鎖定」。

The manual describes this quite well

A型間隙鎖的稱爲插入意圖間隙鎖由到行插入之前INSERT操作設置。這個鎖定以插入到相同索引間隙中的多個事務不需要等待對方的方式插入的意圖,如果它們沒有插入間隙中的相同位置。假設有索引記錄的值爲4和7.嘗試插入5和6值的單獨事務每個在插入行上獲得排它鎖之前用插入意向鎖鎖定4和7之間的間隔,但不要阻止對方,因爲各行不衝突

除此之外,任何獨特指數將被鎖定爲所提供的值,以確保兩個不同的交易不插入相同的值(這是略有不同如果我沒有弄錯的話,比差距鎖)。

+0

乾淨簡潔的信息 – Namphibian 2013-02-26 10:03:33

0

添加到間隙鎖定描述中,Mysql INNODB在正在插入的行上執行ROW-LOCK。