我需要在用户提交网络表单时进行计数。当多个用户同时提交表单时,我遇到了并发问题。一些计数器值是相同的。怎么预防?
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();
答案 0 :(得分:1)
您还可以向实体添加行版本字段,以使EF支持乐观并发:http://www.codeproject.com/Articles/817432/Optimistic-Concurrency-in-Entity-Framework-Code-Fi
如果并发更新,您可以捕获DbUpdateConcurrencyException,重新加载实体并再次递增计数器,如下所示:https://msdn.microsoft.com/en-us/data/jj592904.aspx
答案 1 :(得分:0)
您可以将所有表单提交记录为单独的记录,并在必要时进行汇总。它比线程同步容易得多,适用于多个IIS配置。
答案 2 :(得分:0)
您需要在更新表的代码周围使用lock,但这可能会导致性能问题。
其他选项可能您更改了架构,因此最终您不需要在数据库中保存总计数,但您可以使用Count方法计算它(例如聚合)。