數(shù)據(jù)庫(kù)并發(fā)執(zhí)行任務(wù)如何避免重復(fù)執(zhí)行?

數(shù)據(jù)庫(kù)并發(fā)執(zhí)行任務(wù)如何避免重復(fù)執(zhí)行?

數(shù)據(jù)庫(kù)任務(wù)并發(fā)執(zhí)行的隊(duì)列讀取問(wèn)題

在數(shù)據(jù)庫(kù)中有20個(gè)任務(wù),需要5個(gè)線程并發(fā)執(zhí)行這些任務(wù)。執(zhí)行流程為:

  1. 讀取數(shù)據(jù)庫(kù)
  2. 判斷任務(wù)是否在執(zhí)行中
  3. 若不在執(zhí)行中,則執(zhí)行任務(wù)

當(dāng)多個(gè)線程同時(shí)處理這些任務(wù)時(shí),如何確保每個(gè)任務(wù)只被其中一個(gè)線程執(zhí)行呢?

解決方法

可以使用事務(wù)機(jī)制和 for UPDATE 鎖定來(lái)保證任務(wù)排他性執(zhí)行:

  1. 開(kāi)啟事務(wù)。
  2. 使用 FOR UPDATE 查詢狀態(tài)為未執(zhí)行的任務(wù)。這將鎖定已查詢的任務(wù)。
  3. 將已查詢的任務(wù)狀態(tài)更新為執(zhí)行中。
  4. 結(jié)束事務(wù)。
  5. 執(zhí)行任務(wù)。
  6. 最終更新任務(wù)狀態(tài)為已執(zhí)行。

FOR UPDATE 查詢可以鎖定表,這意味著不會(huì)有兩條 mysql 連接同時(shí)檢索到相同的數(shù)據(jù)。因此,該方法可以確保每個(gè)任務(wù)只被一個(gè)線程執(zhí)行。

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊5 分享