Рядные замки - используя их вручную - PullRequest
7 голосов
/ 19 февраля 2010

У меня в основном есть приложение, которое имеет, скажем, 5 потоков, каждый из которых читает из таблицы. Запрос представляет собой простой SELECT TOP 1 * из таблицы, но я хочу применить блокировку, чтобы следующий поток выбрал следующую запись из таблицы, а не заблокированную. Когда приложение выполнит свою задачу, оно обновит заблокированную запись, снимет блокировку и повторите процесс снова. Возможно ли это?

Ответы [ 3 ]

8 голосов
/ 19 февраля 2010

Такой подход, который я бы порекомендовал, заключается в том, чтобы в записи в поле было указано поле, указывающее, обрабатывается ли запись или нет. Затем реализуйте sproc «читать далее из очереди», который выполняет следующее, чтобы гарантировать, что 2 процесса не получат одну и ту же запись:

BEGIN TRANSACTION

-- Find the next available record that's not already being processed.
-- The combination of UPDLOCK and READPAST hints makes sure 2 processes don't 
-- grab the same record, and that processes don't block each other.
SELECT TOP 1 @ID = ID
FROM YourTable WITH (UPDLOCK, READPAST)
WHERE BeingProcessed = 0

-- If we've found a record, set it's status to "being processed"
IF (@ID IS NOT NULL)
    UPDATE YourTable SET BeingProcessed = 1 WHERE ID = @ID

COMMIT TRANSACTION

-- Finally return the record we've picked up
IF (@ID IS NOT NULL)
    SELECT * FROM YourTable WHERE ID = @ID

Подробнее об этих табличных подсказках см. MSDN

0 голосов
/ 26 ноября 2015

Подробнее о данной технической статье "Обработка очередей данных в SQL Server с помощью READPAST и UPDLOCK"

https://www.mssqltips.com/sqlservertip/1257/processing-data-queues-in-sql-server-with-readpast-and-updlock/

0 голосов
/ 16 февраля 2012

Очереди компонента Service Broker на сервере Sql были разработаны специально для решения этого сценария.

Необходимость блокировки таблиц и строк выглядит как обратный путь для достижения этой функциональности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...