Мне нужно сначала выбрать (скажем) 10000 строк в базе данных и вернуть их. Может быть больше клиентов, которые делают эту операцию одновременно. Я пришел с этим запросом:
update v set v.batch_Id = :batchId
from tblRedir v
inner join (
select top 10000 id
from tblRedir
where batch_Id is null
order by Date asc
) v2 on v.id=v2.id
Это операция, которая состоит из обновления и вложенного выбора. Оба запроса работают с одной и той же таблицей (tblRedir). Идея состоит в том, что строки сначала помечаются уникальным идентификатором batchId, а затем возвращаются через
select * from tblRedir where batch_id = :batchId
(batchid является уникальным идентификатором (например, метка времени или guid) для каждого этого обновления)
Мой вопрос:
Я думал, что операция обновление с вложенным выбором является атомарной - это означает, что каждый клиент получает свой собственный набор данных, который уникален (ни один другой клиент не получил подмножество своих данных).
Однако, похоже, я ошибаюсь - в некоторых случаях есть клиенты, которые не получают данных, потому что, вероятно, они сначала оба выполняют выбор, а затем оба выполняют обновление ( поэтому первый клиент не имеет отмеченных строк).
Эта операция атомарная или нет?
Я работаю с Sql server 2005. Запрос выполняется через NHibernate, как это
session.CreateSQLQuery('update....')