Использование блокировки в хранимой процедуре SQL Server 2005 - PullRequest
1 голос
/ 10 мая 2011

Что я ищу, чтобы избежать параллелизма в моей хранимой процедуре

вот мой сценарий, я пытаюсь установить серию изолирования транзакции;

ALTER proc [dbo].[SP_GenerateNextReportID]
  @type nvarchar(255), @identity int output
   AS BEGIN
         SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
    declare @id int;
    set @id =  IsNull((select LastUsedIdentity from   ReportProcessGenerator       where Type = @type), 0)
    if(@id =0)
      insert ReportProcessGenerator values(@type, @id +1)
     else
        update ReportProcessGenerator set LastUsedIdentity = @id +1 where Type = @type

    set @identity = @id +1
  END

Не уверен, что это правильный путь или нет?

1 Ответ

2 голосов
/ 10 мая 2011

Если у вас есть индекс UNIQUE или PRIMARY KEY на ReportProcessGenerator.Type, то ваши хранимые процедуры не смогут одновременно изменять запись для одного и того же типа.

Обратите внимание, что вы должны использовать предложение SELECT FOR UPDATE или OUTPUT, чтобы избежать взаимоблокировок, как указывает @Martin. При SERIALIZABLE одновременные SELECT запросы не снимают общие блокировки, которые UPDATE запросы не смогут позже обновить.

Однако, почему вы хотите поддерживать отдельные идентификаторы для каждого типа? Как правило, одна идентичность, уникальная для разных типов, так же хороша, как и несколько уникальных для типов, причем первая намного легче поддерживать.

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