У меня есть многопоточное приложение, которое использует 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, если не считать «фиктивного» обновления этих строк, чтобы закрепить их на границе транзакции?