может ли linq обновлять и запрашивать атомарно?

Мне нужно получить 1000 строк из базы данных и в то же время пометить их как «в процессе». Таким образом, другой поток не сможет взять те же 1000 строк и обработать их.

С linq я делаю что-то вроде этого:

msgs = (из m в database.messages где (m.status == MESSAGESTATUSINIT) выберите m).Take(1000).ToList();

в идеале я бы одновременно установил статус MESSAGESTATUSPROCESSING. Конечно, это ДОЛЖНО быть атомарным.

Любые идеи? Или он вернулся к SQL?

Благодарность!


person Toad    schedule 13.03.2009    source источник


Ответы (3)


Вы не можете сделать это в linq2sql. Используйте хранимую процедуру и настройте ее в конструкторе для вывода сообщения. Таким образом, вы можете манипулировать загруженными сущностями и нормально фиксировать изменения.

Проверьте это, чтобы узнать, как это сделать (в частности, сопоставление возвращаемого типа методов SPROC с классами модели данных): http://weblogs.asp.net/scottgu/archive/2007/08/16/linq-to-sql-part-6-retrieving-data-using-stored-procedures.aspx

person eglasius    schedule 13.03.2009

Сам Linq не собирается предлагать эту возможность; Имейте в виду, что Linq == Запросы. Обновление данных происходит в другом месте.

В этом случае вам может быть лучше написать хранимую процедуру для возврата результатов; sproc может обновлять таблицу и возвращать результаты атомарно, и тогда ваше приложение будет иметь один вызов.

person Chris Shaffer    schedule 13.03.2009
comment
linq2sql - это не только запросы, но вы правы, он не поддерживает этот сценарий. В некоторых блогах есть специальные методы для выполнения пакетных обновлений, но они не возвращают набор результатов одновременно. - person eglasius; 13.03.2009

Вы можете окружить код замком{}.

Ключевое слово блокировки

person Brownman98    schedule 13.03.2009
comment
Верно, но я также хочу, чтобы другие процессы (даже на других компьютерах) не получали эти записи. Кроме того, кажется глупым выполнять foreach через 1000 записей и настраивать их для обработки, когда это можно сделать с помощью 1 атомарного оператора sql. - person Toad; 13.03.2009