[英]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.