我有一个Web应用程序,允许用户喜欢的项目.每件物品都有他喜欢的总物品.
当许多用户同时喜欢同一个项目时会出现问题,然后我在sql中收到错误的值(由竞争条件引起).
作为一个临时解决方案,我在控制器构造函数中创建了一个工作线程,它对一个队列起作用,当一个像/不喜欢请求的项目正在接收时,我正在排队这个请求.工作线程正在对值进行dequeing并更新将itemid映射到totalcount的字典.
解决方法
您可以使用RepeatableRead事务范围在读取和写入时锁定数据:
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.required,new Transactionoptions { IsolationLevel = IsolationLevel.RepeatableRead })) { ... context.SaveChanges(); scope.Complete(); }
实体框架跟踪实体字段更改并生成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状态的上下文中.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。