我有一个使用LinqToSql的多线程应用程序。我需要做的一件事就是代表一个线程获取一堆行,例如:
dataContext.Connection.BeginTransaction()
var available = MyThings.Where(t => t.IsAvailable).Take(numberToTake);
// other validation stuff happens here, then:
foreach (var t in available) {
t.IsAvailable = false;
t.GrabbedBy = this;
dataContext.SubmitChanges();
}
dataContext.Connection.CommitTransaction();
麻烦的是,第2行中的查询似乎没有锁定MyThings
表,因为其他线程似乎能够抓取此线程抓取的相同行,这显然不是一件好事。我不能在这个块周围放置代码锁,因为不同的线程可能在不同的内存空间中运行,甚至可能在不同的计算机上运行。但我确实需要能够使用数据库级事务边界锁定这些行,以防止其他人在我执行验证时抓住它们。
使用LinqToSql是否有任何内置方法可以对这些行进行“虚拟”更新,以便在事务边界中巩固我对它们的控制?