Linq-to-Sql Чтение-Тест-Запись как одна операция - PullRequest
1 голос
/ 12 ноября 2010

У меня есть Tasks таблица: Id (PK), TaskName, Status
Состояние одно из: В очереди , Занято , Завершено .
Я хочуиспользовать несколько потоков для обработки задач, и для этого мне нужно выполнить одну операцию:

var task = db.Tasks.FirstOrDefault(t=>t.Status == (byte) TaskStatus.Queued);
task.Status = (byte) TaskStatus.Busy;
db.SubmitChanges();

Очевидно, что если операция не является атомарной, у меня могут возникнуть проблемы с параллелизмом.Каков (если таковой существует) намеченный способ сделать вышеизложенное с использованием Linq-to-Sql?

Я знаю, что могу сделать это с 1) storproc или 2) db.ExecuteCommand("...") или 3) обработать конфликт with try/catch - но я хочу быть уверенным, что лучшего способа не существует.

Я знаю, что это очень простой вопрос, но я не смог найти однозначного ответа на этот вопрос.

1 Ответ

1 голос
/ 14 ноября 2010

Если вы хотите быть уверены, что это происходит атомарно в базе данных (независимо от того, какой поток или приложение его вызывает), вам, вероятно, следует сделать это в sproc и заблокировать на соответствующем уровне. Sproc должен извлечь и обновить запись, затем освободить и вернуть ее (Ack! Я не имею в виду оператор TSQL return, но вы знаете, я имею в виду select это, я верю!)

Таким образом, L2S просто вызывает sproc и возвращает задание для работы, уже установленное как Busy. L2S не знает (и не заботится) о том, что / как было заблокировано, и поэтому не может усложнить ситуацию и увеличить шансы на взаимоблокировку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...