Linq中的事务边界在运行查询后锁定表?

时间:2011-06-14 15:02:44

标签: c# linq linq-to-sql

我有一个使用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是否有任何内置方法可以对这些行进行“虚拟”更新,以便在事务边界中巩固我对它们的控制?

1 个答案:

答案 0 :(得分:2)