2014-11-17 42 views
2

即使對於諸如SELECT COUNT(*) FROM t的查詢,MySQL InnoDB表是否仍在等待寫鎖定?COUNT(*)是否等待InnoDB中的行鎖?

我的情況:

我有表50000行有許多更新(意見每一行計數)。 InnoDB應該在更新的行上寫入鎖定。但是當我在這張表上只有COUNT(*)的查詢時,即使沒有等待寫入鎖,MySQL也可以回答這個查詢,因爲沒有UPDATE會改變行數。

非常感謝!

回答

2

不,MySql不鎖定只從表中讀取數據的查詢的InnoDb表。
這只是舊MyIsam表的情況,所有讀者必須等到作家完成後,反之亦然。

InnoDB表他們實現Multiversion concurrency control

在MySQL中的術語,被稱爲Consistent Nonlocking Reads

總之 - 當讀者開始查詢,數據庫使得數據庫的快照在時間點查詢已開始,閱讀器(查詢)只能看到迄今爲止可見(提交)的更改,但看不到以後的事務所做的更改。這使讀者不鎖定和等待的作家,但仍保持讀取數據ACID

有根據事務隔離級別細微的差別,你可以找到詳細的描述在這裏:http://dev.mysql.com/doc/refman/5.6/en/set-transaction.html

總之 - 在讀uncommited,閱讀提交可重複讀取模式下,所有隻讀取數據(沒有FOR UPDATE或LOCK IN SHARE MODE分類的SELECT語句)以非鎖定方式執行。
模式所有transacions都被序列化,並且根據自動提交模式,當與其他事務衝突時(當autocommit = true時),或者自動轉換爲SELECT ... LOCK IN SHARE MODE(當自動提交時= FALSE)。所有細節都在上面的鏈接中解釋。

+0

好的,所以只是爲了確保:UPDATE中沒有行鎖定,會阻止SELECT COUNT(*)?因此,基本上每個時刻至少可以更新1行,並且SELECT查詢仍然可以正常執行(在可重複讀取隔離級別的情況下)?謝謝! – koubic

+0

是的,包括選擇計數(*)在內的普通選擇不會被更新阻止。 – krokodilko