Как я могу заблокировать таблицу на чтении, с помощью Платформы Объекта?

У меня есть SQL Server (2012), который я получаю доступ к Платформе Объекта использования (4.1). В базе данных у меня есть таблица под названием URL, в который независимый процесс подает новые URL. Запись в таблице URL может быть в "Новом" состоянии, "В Процессе" или "Обработана".

Я должен получить доступ к таблице URL от различных компьютеров, проверить на записи URL с состоянием "New", взять первое и отметить его как "В Процессе".

var newUrl = dbEntity.URLs.FirstOrDefault(url => url.StatusID == (int) URLStatus.New);
if(newUrl != null)
{
    newUrl.StatusID = (int) URLStatus.InProcess;
    dbEntity.SaveChanges();
}
//Process the URL

Так как запрос и обновление не являются атомарными, я могу иметь два других компьютерных чтения и обновить ту же запись URL в базе данных.

Существует ли способ заставить select-then-update упорядочить атомарный для предотвращения таких столкновений?

58
задан 15 November 2012 в 23:17

1 ответ

Вы могли попытаться передать UPDLOCK, подсказывают базе данных и просто блокируют определенные строки.. Так, чтобы, что это выбирает для обновления его также aquires монопольная блокировка на том, таким образом, это может сохранить свои изменения (вместо того, чтобы просто получить readlock в начале, что это более поздние попытки обновить позже при сохранении). Holdlock, предложенный jocull выше, является также хорошей идеей также.

private static TestEntity GetFirstEntity(Context context) {
return context.TestEntities
          .SqlQuery("SELECT TOP 1 Id, Value FROM TestEntities WITH (UPDLOCK)")
          .Single();
}

я настоятельно рекомендую рассматривать оптимистичный параллелизм: https://www.entityframeworktutorial.net/EntityFramework5/handle-concurrency-in-entity-framework.aspx

0
ответ дан 1 November 2019 в 14:44

Другие вопросы по тегам:

Похожие вопросы: