我有一个允许用户喜欢项目的 Web 应用程序。每个项目都有他获得的总喜欢的属性。
当许多用户同时喜欢同一个项目时,就会出现问题,然后我在 SQL 中收到不正确的值(由竞争条件引起)。
作为临时解决方案,我在 Controller 构造函数中创建了一个工作线程来处理队列,当接收到一个喜欢/不喜欢的项目时,我正在排队这个请求。工作线程正在对值进行出列并更新将 itemid 映射到 totalcount 的字典。
然后工作线程每一分钟用结果更新一次数据库。
附带问题:context.SaveChanges()
是否仅保存对象中更改的内容?或者它是否保存了对象的所有属性?
我有一种感觉,此解决方案不是正确的解决方案,处理此类问题的最佳方法是什么?
最佳答案
您可以使用 RepeatableRead
事务范围在读写发生时锁定数据:
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = IsolationLevel.RepeatableRead }))
{
...
context.SaveChanges();
scope.Complete();
}
Entity Framework 跟踪实体字段更改并生成 sql 代码以仅更新已修改的那些。您可以明确指定您只想更新一个实体属性并忽略其他更改:
context.Entry(entity).State = EntityState.Unchanged;
context.Entry(entity)
.Property(c => c.entityField).IsModified = true;
当您将对象附加到上下文中时,它也很有用:
context.Attach(entity);
context.Entry(entity)
.Property(c => c.entityField).IsModified = true;
因为
Attach
将实体及其属性放入 Unchanged
状态的上下文中。关于c# - ASP.NET | Entity Framework ,竞争条件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38772167/