Требуется помощь при блокировке - PullRequest
0 голосов
/ 12 декабря 2011

У меня есть хранимая процедура, которая SELECT выводит запись TOP 1 из таблицы и присваивает некоторым переменным значения столбцов.Затем SELECT s 10 записей, где столбец Id имеет то же значение, что и столбец переменной TOP 1.

SELECT TOP 1 @Id = [Id]
  FROM [TableA]
 ORDER
    BY [DateCreated], [Priority]

SELECT TOP 10 *
  FROM [TableA]
 WHERE [Id] = @Id;

Цель состоит в том, чтобы SELECT одна запись, а затем получить 10 соответствийзаписи для обработки.Это работает, если одно соединение вызывает хранимую процедуру.У меня есть приложение, которое является многопоточным, и это затем вызывает проблему, потому что, если первая и вторая записи одинаковы Id, я бы хотел, чтобы они были в одном наборе результатов, так что второй поток будет забиратьдругое значение.Вот где у меня проблема.Я пытался использовать подсказки HOLDLOCK, UPDLOCK, ROWLOCK в первом операторе SELECT, но это блокирует первую запись и позволяет другому потоку выбрать следующее значение, которое я хотел бы в первом потоке.Я также запустил TRANSACTION в хранимой процедуре и изменил ISOLATION LEVEL на READ COMMITTED, но второй поток всегда получает и принимает следующее значение, прежде чем первый поток сможет SELECT 10 записей, где Id с совпадением.

У кого-нибудь есть идеи, как мне поступить?Возможен ли такой подход?

1 Ответ

1 голос
/ 12 декабря 2011

Ваш подход кажется странным: выбор из той же таблицы, ТОП без ORDER BY и т. Д.

При отсутствии какой-либо другой информации и в предположении, что вы хотите сохранить то же решение, вам придется использовать семафорное решение с sp_getapplock . Это позволит сериализовать доступ через ваш код: 2-й процесс может подождать или переждать, и т.д. в зависимости от того, как вы установите параметры

...