我有類似的代碼:
var records = db.Records.Where(r => r.IsProcessing == false).Take(100).ToList();
records.IsProcessing = true;
await db.SaveChangesAsync()
...further work with recods
如果此代碼在微服務的多個實體上運行,是否會發生并發問題?(即兩個服務將獲得相同的記錄集)。如果是 - 我該如何預防?
如果他們同時呼叫此方法,我想防止我的服務從資料庫獲取相同的記錄。
uj5u.com熱心網友回復:
您可以使用在可序列化事務中運行的存盤程序檢索行。您可能需要表中的其他屬性,例如記錄分配給該行的服務的 AssignedTo,以及指示處理已完成的另一個屬性。否則,如果服務檢索某些行但在完成所有處理之前失敗,則這些行將保持未處理狀態。當服務檢索行時,它可以使用諸如 AssignedTo = self 或 AssignedTo Is Null 之類的條件。大概還有一個時間戳或其他一些方式來確定所選行的優先級。
uj5u.com熱心網友回復:
是的,它會的,而且要防止它可能并不那么容易。
想象一下,這些服務的任務是更新帳戶余額。他們讀取余額,并在其上添加存款金額:
service 1: on a busy machine (slow)
service 2: on a not so busy machine (fast)
"john" has £100 on his account
service 1: read
service 2: read
service 1: balance = balance 100;
service 2: balance = balance 100;
service 2: set processing = true
service 2: set processing = true
service 2: update record
service 1: update record.
john ends up with £200 instead of £300.
您將需要引入一個事務范圍,也許用 redis 管理它,以便每個實體都有一個事實點來檢查是否可以進入和退出更新范圍。如果您愿意,可以通過網路進行“IsProcessing?或 SetIsProcessing”。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/364412.html
