Как бы заблокировать хранимую процедуру, которая выполняется, и изменить таблицу, которую возвращает хранимая процедура? - PullRequest
0 голосов
/ 17 июня 2019

У меня есть следующая таблица:

id    status
--    ------
1     pass
1     fail
1     pass
1     na
1     na

Также у меня есть хранимая процедура, которая возвращает таблицу с топ-100 записями, имеющими статус 'na'.Хранимая процедура может вызываться несколькими узлами в среде, и я не хочу, чтобы они извлекали дублирующиеся данные.Итак, я хочу заблокировать хранимую процедуру во время ее выполнения и установить состояние записей, полученных из хранимой процедуры, равным «В процессе» и вернуть эту таблицу, а затем снять блокировку, чтобы разные узлы не извлекали одно и то жеданные.Как мне это сделать?

1 Ответ

1 голос
/ 17 июня 2019

Вы можете использовать выбор с WITH (SERIALIZABLE) уровнем изоляции, чтобы убедиться, что записи заблокированы, пока статус не будет обновлен, как показано ниже.

SELECT TOP 100 id 
INTO   #temp 
FROM   [your_table] WITH (serializable) 
WHERE  status = 'na' 

UPDATE ut 
SET    status = 'In Progress' 
FROM   [your_table] ut WITH (serializable) 
       INNER JOIN #temp T 
               ON T.id = ut.id 

SERIALIZABLE Уровень изоляции Указывает следующее:

  • Операторы не могут читать данные, которые были изменены, но еще не зафиксированы другими транзакциями.
  • Никакие другие транзакции не могут изменять данные, которые были прочитаны текущей транзакцией, до тех пор, пока текущая транзакция не завершится.
  • Другие транзакции не могут вставлять новые строки со значениями ключей, которые попадают в диапазон ключей, считываемых любыми инструкциями в текущей транзакции, пока текущая транзакция не завершится.

Источник (MSDN)

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