2011-05-19 54 views
0

數據插入到多個服務器的表中@ 100-200個插入/秒的速率。每個服務器按照id順序讀取該表中的所有行,並在每隔幾秒運行一次的計時器線程中處理數據。讀入的最後一個ID存儲在內存中,並在下次查詢時再次使用。MySQL讀取返回後面的行,但不返回前面的行

發生什麼事是一些行不被讀取數據的函數讀取;當插入率很高時,會跳過它們。

這是場景。

讀取數據的函數讀入數據直到ID 100,它現在試圖讀取ID大於100的行。返回的行是101,102,104,105。第103行被跳過(儘管它存在)。

發生什麼事的當前工作原理是,由於數據是由多個服務器插入的,所以當讀取發生時,行103沒有被提交,因此不作爲結果集的一部分返回。提交可能發生在這次閱讀之後。事務隔離級別設置爲'REPEATABLE-READ'。

有沒有人遇到過這樣的事情?它是如何處理的。歡迎任何建議。

編輯:我正在尋找一種方式來閱讀所有的行順序沒有任何差距。

回答

1

你的猜測幾乎可以肯定發生了什麼。

有未提交的插入。一旦其他線程使用該序列,該序列仍會增加,但在提交之前您不會看到該行。

您的結果集從查詢啓動時起將保持一致性,所以即使在返回結果期間該行已被提交,您仍然不會在查詢後再查看它。

你在尋找什麼建議?您將永遠無法讀取未提交的行。

+0

感謝您的確認。我編輯了這個問題,但我正在尋找一種方法來按順序讀取所有行。 – smahesh 2011-05-19 21:54:19

+0

+1進行確認 – smahesh 2011-05-19 23:40:25