2012-01-30 114 views
4

我在InnoDB數據庫中使用mysql。MYSQL - 鎖定 - InnoDB

如果我所有的事務都是插入和選擇(沒有更新),我假設我不必擔心SQL死鎖。

我看不到會發生死鎖的場景。我是否正確地認爲,如果我只進行插入和選擇,就不會發生死鎖?

可能不相關,但一切事務與PDO

+1

有不同的'INSERT'語句:'INSERT ... VALUES ...','INSERT ... SELECT ...'。你使用兩個還是僅使用第一個變體? – 2012-02-01 20:04:31

+0

還有'INSERT ... ON DUPLICATE KEY UPDATE'。我想你沒有那個。 – 2012-02-01 20:31:32

+0

這是關於特定事務隔離級別的問題嗎?還是一般的(關於所有這些)? – 2012-02-01 20:33:11

回答

1

號你還是擔心SQL死鎖完成。

即使在插入單行的事務的情況下,也可能會出現死鎖。這是因爲插入操作不是真正原子化的,並且在插入行的(可能有幾個)索引記錄上自動設置鎖。

+0

如果您只運行'INSERT INTO ... VALUES'語句,會發生死鎖嗎?你能給個例子嗎? – 2012-02-01 20:16:42

+0

這與在這種情況下是否會發生死鎖確實無關。無論您使用的是INSERT VALUES還是INSERT SELECT等,插入「可能」會鎖定索引的一部分。 – 2012-02-01 20:43:31

+0

任何事務都可能鎖定行或表或索引。但不同類型的事務可以做不同類型的鎖。這與死鎖發生的方式有關。 – 2012-02-01 20:47:23

0

InnoDB MySQL存儲引擎具有行級鎖,而MyISAM MySQL存儲引擎具有表級鎖。 MyISAM只是鎖定整個表,並且不支持事務,所以不可能存在數據庫級的死鎖。請注意,應用程序可以通過坐在他們都試圖訪問的表上的表鎖上來鎖定另一個應用程序,但這是代碼錯誤,而不是數據庫級的「死鎖」。

InnoDB支持事務並且具有行級鎖,因此db級的死鎖是可能的(並且偶爾會在繁忙的系統中發生,所以您確實需要圍繞它們進行編碼)。很多MySQL會稱之爲「死鎖」並不是「真正的死鎖」,因爲它們是由於UPDATE緩慢導致其他查詢在行鎖定上超時導致的。