[英]Entity Framework concurrent issue a field value increase 1 according to the existing value
我需要計算用戶提交Web表單的時間。 當多個用戶同時提交表單時,我遇到了一個並發問題。 一些計數器值是相同的。 怎么預防?
var db = new MyDB();
var maxCounter = db.TableA.Where(x=>x.OrgId == 1).Max(x=>x.counter);
int newCounter = 0;
if(maxCounter != null)
{
newCounter = maxCounter +1;
}
var newRecord = new TableA(){ OrgId = 1, counter = newCounter, createdDate = DateTime.Now, createdBy = username };
db.TableA.Add(newRecord);
db.SaveChanges();
您還可以向您的實體添加行版本字段以使EF支持開放式並發: http : //www.codeproject.com/Articles/817432/Optimistic-Concurrency-in-Entity-Framework-Code-Fi
如果並發更新,則可以捕獲DbUpdateConcurrencyException,重新加載實體並再次增加計數器,如下所示: https ://msdn.microsoft.com/zh-cn/data/jj592904.aspx
您可以將所有表單提交記錄為單獨的記錄,並在必要時進行匯總。 它比線程同步容易得多,並且適用於多個IIS配置。
您需要在確實會更新表的代碼周圍使用鎖 ,但這可能會導致性能問題。
其他選項可能是您更改了架構,因此最終您不需要將總計數保存在數據庫中,但是您可以使用Count方法(例如,聚合)進行計算。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.