对Sql Server 2014使用Entity Framework 6,我得到一个要处理的项目列表,其StatusId为1.处理完每个项目后,它将以状态2保存,因此不会再次处理。处理可能需要几分钟。
然而,这不是“Threadsafe”所说的。换句话说,如果代码在第一个完成之前再次启动(例如通过不同的进程),则项目的状态仍为1,因此它再次在队列中结束并再次处理。
如何获取要处理的记录并确保第二次不检索这些记录?例如,是否可以在事务中检索数据并更新状态?
答案 0 :(得分:1)
您可以在transaction
语句中包装EF lock
,以确保在任何给定时间只有一个线程正在访问处理逻辑。
lock 关键字将语句块标记为关键部分 获取给定对象的互斥锁,执行a 声明,然后释放锁。
private void ProcessEntities(IEnumerable<Entity> entities)
{
lock (processLock)
{
using (var transaction = SomeDbContext.Database.BeginTransaction())
{
try
{
// process...
// ...
SomeDbContext.SaveChanges();
transaction.Commit();
}
catch (Exception e)
{
transaction.Rollback();
Log(e);
throw;
}
}
}
}