2013-11-24 42 views
12

讓我們說我有兩個用戶試圖按照以下順序訪問名爲「comments」的數據庫中的一個表:澄清InnoDB引擎中的行級鎖定與MySQL數據庫中的MyISAM引擎中的表級鎖定之間的區別

  1. 用戶1製作和更新使用id = 10

    UPDATE評論SET評論= 「Hello World」 的記錄WHERE ID = 10

  2. 用戶2正在作出選擇的所有行同一張桌子評論

    SELECT * FROM評論

我想討論的下列情況的區別是:

  1. 如果表的引擎是MyISAM數據:更新查詢將鎖定 整個表,將排隊選擇查詢,直到 更新該行完成,然後它將被執行,這將停止任何 用戶詢問該表中的任何內容,直到更新爲 完成。
  2. 如果表的引擎是InnoDB:更新查詢將鎖定更新的行。

我想知道這個鎖如何影響選擇查詢?

我的意思是,如果select請求數據庫中的評論表的整個記錄​​,並發現其中一個(id = 10)被鎖定,數據庫再次排隊select查詢,直到更新完成?

如果是,那麼兩個引擎之間有什麼區別?

如果不是,我想說我在我的網站上面有同樣的情況,甚至我改變了我的表引擎從MyISAM到InnoDB,但是仍然發生更新或插入查詢時排隊請求的問題。

對這種情況的任何解釋都會很有幫助。提前致謝

+0

在您的示例中,select必須等待更新才能完成兩個引擎。如果選擇查詢不包含ID爲10的記錄(被更新鎖定),這種情況會有所不同,在這種情況下,MyISAM select必須等待,但InnoDB不會。 「InnoDB中的這個特性被稱爲併發性」 - http://stackoverflow.com/a/28070969/934739 –

回答

1

在InnoDB中,它取決於是否啓用事務。 InnoDB具有MVCC功能,這意味着線程1正在更新,線程2可以無鎖地讀取。

這是已經在這裏回答InnoDB's row locking the same as MVCC Non-Blocking Reads?

如果交易被禁止,用相同的MyISAM?我想如此但不確定。

+0

我所有的表都改爲InnoDB,這個表可能是InnoDB,但事務被禁用了嗎?如果是的話我怎樣才能知道它是否被禁用,以及如何啓用它 – Basel

+0

@Basel我的意思是如果自動提交關閉,那麼當前連接的交易被禁用。要使用事務,「SET autocommit = 0; START TRANSACTION; UPDATE ....; COMMIT;」 –

0

在你的場景中Innodb的結果將爲選擇查詢,但與舊數據的行,其中id = 10,如果不更新。結果不會停止。

相關問題