因此,我正在編寫一個簡單的網站爬蟲,用於維護內部網站。它會通過每個鏈接,添加新的鏈接,因爲它發現它們,注意到標題和H1標籤等。MySQL在更新的選擇查詢中鎖定行
它偶爾會重複標題和H1標籤,當源中只有一個時,我手動檢查它。
出現這種情況的原因是因爲抓取腳本通過cron運行,它似乎是重疊的,所以在處理同一個頁面的兩倍。
該腳本將基本搶已未抓取頁面,那麼如果HTTP響應是200,將其標記爲抓取和處理它所需要。
因此,SELECT和UPDATE之間的某處,腳本的另一個線程上選擇了同一行運行。
有沒有辦法要麼SELECT和UPDATE在相同的查詢,或鎖定在SELECT返回的行,因此它不能再在另一個線程另一個查詢,直到我完成了它回來了?
有在當時一看 - http://dev.mysql.com/doc/refman/5.0/en/innodb-locking-reads.html和一般的SELECT FOR UPDATE的東西,但我仍然不確定。
編輯
我使用這樣的事情
START TRANSACTION;
SELECT .. FOR UPDATE;
UPDATE .... ;
COMMIT;
但它不喜歡它。我在這張桌子上使用InnoDB。我認爲這可能不是前進的方向,因爲它直接提交行的處理直到提交後,當我希望它實際上不能再次選擇行時。
我已經通過執行SELECT覆蓋了這一點,然後在處理它之前執行UPDATE以標記字段爲已爬網字段,但事實是這不是無縫的,這似乎是導致問題的原因。我需要一種方法來無縫地選擇和更新字段,或選擇並停止它被再次選擇,直到我這樣說。
任何一個例子的機會呢?我已向OP添加了更多信息,但我沒有任何運氣 – Horse
ISOLATION LEVEL SERIALIZABLE有什麼作用?我讀過這個(http://dev.mysql.com/doc/refman/5.0/en/set-transaction.html#isolevel_serializable),但沒有多大意義。謝謝! –