2013-05-13 65 views
0

此表有兩個字段,價格和金額。在Innodb中記錄鎖定,是否可以工作

我表演上選擇了更新,其價格低於100(查詢1)中的所有記錄這個InnoDB表的查詢。

  1. 雖然此查詢是怎麼回事,我希望能夠在有價greather 100.這是一定的工作表中插入或更新行?

  2. 與此同時,我想保證任何試圖更新或插入行的表格,其價格低於100將不會發生,直到(查詢1)完成。這也是確定的嗎?

  3. 如果我想在查詢類型1的時候執行普通select *查詢,並且問題2中的查詢能夠執行這些讀操作,或者這些讀操作是否必須等到鎖關閉了嗎?這一定是肯定的。編輯:我想這些選擇將能夠訪問任何記錄表

  4. 最後,指標得到這個工作的關鍵?還是會按原樣工作?

非常感謝。

回答

1

如果你的表只有兩個字段(價格和數量),這似乎是...壞。那裏肯定應該有一些其他的標識符?

  1. 是的。 SELECT FOR UPDATE只鎖定它選擇的記錄。

  2. 也許吧。根據您的transaction isolation mode,MySQL可能會鎖定索引範圍,以阻止插入到作爲查詢一部分進行掃描的範圍中。

  3. 這取決於您使用的事務隔離模式。如果使用更高的隔離模式,鎖定更新的行將阻止它們被讀取,因爲事務可能會或可能不會最終對其進行更改,具體取決於它是否已提交。有關詳細信息,請參閱MySQL手冊的「SELECT ... FOR UPDATE and SELECT ... LOCK IN SHARE MODE Locking Reads」部分。

  4. 是的。第二部分提到的索引範圍鎖定取決於索引。無論如何,運行未索引的查詢是一個糟糕的主意 - 避免它。

+0

關於第3點,那麼有沒有辦法讀取當前正在通過「SELECT FOR UPDATE」查詢的記錄?是的,請指教。該鏈接是信息性的,但我不知道該怎麼做。感謝您的其他答案。 – 2013-05-13 15:45:37

+0

正如我所說的,這取決於您當前的[事務隔離模式](http://dev.mysql.com/doc/refman/5.5/en/set-transaction.html)。 (基於某些信息,我在那裏感到驚訝,我已經更新了其他一些觀點。) – duskwuff 2013-05-13 16:07:45

+0

只是爲了澄清,如果您的TX隔離級別爲SERIALIZABLE或REPEATABLE-READ,則讀取將被阻止,並且如果級別READ COMMITTED或READ UNCOMMITTED – 2013-05-13 16:22:46