數(shù)據(jù)庫(kù)任務(wù)并發(fā)執(zhí)行的隊(duì)列讀取問(wèn)題
在數(shù)據(jù)庫(kù)中有20個(gè)任務(wù),需要5個(gè)線程并發(fā)執(zhí)行這些任務(wù)。執(zhí)行流程為:
- 讀取數(shù)據(jù)庫(kù)
- 判斷任務(wù)是否在執(zhí)行中
- 若不在執(zhí)行中,則執(zhí)行任務(wù)
當(dāng)多個(gè)線程同時(shí)處理這些任務(wù)時(shí),如何確保每個(gè)任務(wù)只被其中一個(gè)線程執(zhí)行呢?
解決方法
可以使用事務(wù)機(jī)制和 for UPDATE 鎖定來(lái)保證任務(wù)排他性執(zhí)行:
- 開(kāi)啟事務(wù)。
- 使用 FOR UPDATE 查詢狀態(tài)為未執(zhí)行的任務(wù)。這將鎖定已查詢的任務(wù)。
- 將已查詢的任務(wù)狀態(tài)更新為執(zhí)行中。
- 結(jié)束事務(wù)。
- 執(zhí)行任務(wù)。
- 最終更新任務(wù)狀態(tài)為已執(zhí)行。
FOR UPDATE 查詢可以鎖定表,這意味著不會(huì)有兩條 mysql 連接同時(shí)檢索到相同的數(shù)據(jù)。因此,該方法可以確保每個(gè)任務(wù)只被一個(gè)線程執(zhí)行。
? 版權(quán)聲明
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載。
THE END