SQL Server - сценарий блокировки / блокировки - PullRequest
0 голосов
/ 09 декабря 2011

У меня есть некоторые функции обработки файлов, которые используют таблицу базы данных, чтобы установить, был ли обработан файл.

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 маркера.

Чего мне не хватает?

Ответы [ 2 ]

2 голосов
/ 09 декабря 2011

Я уже отвечал на подобные вопросы раньше: Состояние гонки очереди процесса SQL Server .В итоге вам нужны подсказки ROWLOCK, READPAST, UPDLOCK для использования таблицы в качестве очереди.

Однако вы не можете "заблокировать" один и тот же файл с помощью блокировок механизма БД, поскольку это подразумевает, что транзакция остается открытой, пока файлв процессе.Что вы можете сделать, это «пометить» файл, чтобы он был пропущен другим процессом в безопасном параллельном режиме согласно моей ссылке выше

У меня есть и другие ответы, которые могут помочь вам https://stackoverflow.com/search?tab=votes&q=user%3a27535%20readpast

0 голосов
/ 09 декабря 2011

Попробуйте добавить READPAST, чтобы разрешить точку 2.

Вас может заинтересовать эта статья

...