2011-07-12 89 views
9

是否"SELECT ... FOR UPDATE"鎖定連接MySQL行?MySQL InnoDB鎖定連接行

如果是這樣,是否可以禁用此行爲?

在文檔中沒有關於此的內容。我已經看到Oracle支持"SELECT ... FOR UPDATE OF table_name",其中table_name是主表或者受影響的行將被鎖定的連接表之一,但是我從來沒有在MySQL的上下文中看到過這一點。

+0

update語句是否鎖定其他表中的行?我認爲它應該(可能取決於隔離級別),因爲更新中的值可能取決於另一個表上的值。你需要使用更新嗎?也許鎖定共享模式是你在找什麼?無論如何,我個人對這個答案感興趣,但也許唯一的辦法是測試這個。 –

+0

我已經使用InnoDB插件提供的增強信息以及我的事務鎖定的行數和應用程序的行爲做了一些研究,我會說MySQL除了鎖定主表的行外還鎖定了所有連接的行。我一直沒能找到一個查詢子句或一個InnoDB選項來改變這一點,所以看起來我們現在堅持這種默認行爲。 –

+0

我在MySQL文檔中找到了答案 – RolandoMySQLDBA

回答

0

SELECT ... FOR UPDATE鎖定行和任何關聯的索引條目,就像爲這些行發出UPDATE語句一樣。

然後

如果自動提交已啓用,符合規範的行不會被鎖定。

這是不是mySQL doc不提供答案?

+1

否,文檔中未提及JOIN。 –

4

請參閱this MySQL doc page。它說:

鎖定讀取,UPDATE或DELETE通常會在處理SQL語句時掃描的每個索引記錄上設置記錄鎖定。在聲明中是否存在WHERE條件將排除該行並不重要。

和:

對於SELECT ... FOR UPDATE或SELECT ... LOCK IN SHARE MODE,獲取鎖定的掃描行,並預計將發佈針對不符合行包含在結果集中(例如,如果它們不符合WHERE子句中給出的條件)。但是,在某些情況下,行可能不會立即解鎖,因爲在執行查詢期間,結果行與其原始源之間的關係會丟失。

「掃描行」是指來自連接中使用的任何表的行。