我有一个允许用户喜欢项目的 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/

10-11 20:34