Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Монополизированный select  [new]
Makar4ik
Member

Откуда: Когда-то были Лужки, а теперь Бордюр-Сити.
Сообщений: 2680
Доброго времени суток, all!

Есть задачка.

простенькая табличка, допустим,

create table tab1(
id int not null IDENTITY primary key,
op_id int not null,
processed int not null)
В табличке регулярно (часто) появляются новые записи (всегда с ключиком processed = 0)

Есть N-ное количество роботов, они работают иногда из шедулера MSSQL, иногда это системные сервисы, иногда запросы приходят из сети через файерволл, короче, их много, и они разные, связываются с MSSQL через что угодно, хоть через ODBC.
Роботы регулярно (очень часто) спрашивают из этой таблички примерно такое:
select * from tab1 where processed = 0
после получения выборки, робот ОБЯЗАН отработать, и выставить у всех отработанных записей флажки processed = 1
(отрабатывать он может несколько секунд)

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

В связи с этим вопрос:
Как бы так сделать, чтобы конкурирующие запросы гарантированно не могли получить выборку, которую уже начал читать другой процесс?

вычитывать в курсор с одновременным обновлением?
какие-то локи таблицы?

Вторая проблема в том, что количество новопоступающей информации, и количество проверок на её наличие - довольно велики, и хочется решения, которое скушает минимальные ресурсы.

что-то типа "select for update with ROWLOCK"

Заранее большущщее спасибо за любые разумные идеи.
19 май 11, 02:24    [10675410]     Ответить | Цитировать Сообщить модератору
 Re: Монополизированный select  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Накладывать любой несовместимый с самим собой лок. Т.е. начиная с updlock. (Но лучше сразу xlock, чтобы не было фокусов на конвертации).
19 май 11, 02:39    [10675439]     Ответить | Цитировать Сообщить модератору
 Re: Монополизированный select  [new]
Makar4ik
Member

Откуда: Когда-то были Лужки, а теперь Бордюр-Сити.
Сообщений: 2680
хм...
если можно - чуть подробнее. спасибо.
19 май 11, 02:43    [10675447]     Ответить | Цитировать Сообщить модератору
 Re: Монополизированный select  [new]
Makar4ik
Member

Откуда: Когда-то были Лужки, а теперь Бордюр-Сити.
Сообщений: 2680
Мне надо сделать сперва select, потом update. Но это всё внутри лока.
...Чтобы другие не видели того, что я сейчас вычитал, но по возможности, могли читать то, что появилось в таблице за последние 500 милисекунд.
19 май 11, 02:46    [10675451]     Ответить | Цитировать Сообщить модератору
 Re: Монополизированный select  [new]
Glory
Member

Откуда:
Сообщений: 104751
update mytable set processed = 1
OUTPUT INSERTED.id,
       INSERTED.op_id
where processed = 0
19 май 11, 04:28    [10675544]     Ответить | Цитировать Сообщить модератору
 Re: Монополизированный select  [new]
Makar4ik
Member

Откуда: Когда-то были Лужки, а теперь Бордюр-Сити.
Сообщений: 2680
Glory,

суперско!!!!
большой человеческий поклон!
19 май 11, 04:33    [10675548]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить