У меня есть некоторые функции обработки файлов, которые используют таблицу базы данных, чтобы установить, был ли обработан файл.
IF EXISTS (SELECT * FROM FileTable WITH (UPDLOCK, ROWLOCK, HOLDLOCK)
WHERE FileName = @FileToProcess)
BEGIN
-- File already processed.
END
ELSE
BEGIN
-- Process file.
END
Мне нужно следующее поведение: -
- Только одна транзакция должна обрабатывать файл за раз.
- Одновременно обрабатываются разные файлы.
- Если попытаться обработать тот же файл во время его обработки, то эта транзакция будет заблокирована до завершения другой.
Я почти уверен, что это возможно, но мои знания о блокировке SQL еще не до конца! Мои попытки до сих пор либо включают подсказки блокировки в примере выше, который не соответствует пункту 2 маркера. Все другие подсказки блокировки, которые я пробовал, привели к сбоям пункта 3 маркера.
Чего мне не хватает?