簡體   English   中英

如何防止在處理行時選擇該行?

[英]How to prevent selection of the row while it is being handled?

我有帶有列is_locked MySQL(InnoDB)表,該表顯示記錄的當前狀態(現在是由系統處理還是不由系統處理)。

另一方面,我有許多執行SELECT * FROM table_name WHERE is_locked = 0節點,然后處理從該表獲得的行。

在我的代碼中,我這樣做:

  1. 系統從數據庫獲取行( SELECT * FROM table_name WHERE is_locked = 0
  2. 系統通過命令UPDATE table_name SET is_locked = 1 WHERE id = <id>鎖定行

問題:節點運行非常快,所有節點都可能獲得同一行,然后它們首先更新該行並將is_locked設置為1

我發現了表的鎖定,但我認為這不是正確的方法。 誰能告訴我如何處理這種情況?

我建議兩件事:

  • 將選擇范圍限制為一個,因為您要處理並發問題,因此每次迭代最好取較小的“位數”

  • 使用事務,這使您可以啟動事務,獲取記錄,將其鎖定然后提交事務。 這將迫使mysql強制執行您的並發鎖。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM