Возвращение значения и обновление строки без «вмешательства» в SQL Server - PullRequest
1 голос
/ 04 апреля 2011

У меня есть эта хранимая процедура

CREATE PROCEDURE spGrabSerial
  @serial nvarchar(16) output
AS
BEGIN
  SET NOCOUNT ON;
  set @serial = (SELECT top 1 serial from tblSerial)
  update tblSerial set InUse = 1 where serial = @serial
END

Как я могу убедиться, что никакая другая процедура не захватывает один и тот же серийный номер между выбором и обновлением?

Ответы [ 2 ]

6 голосов
/ 04 апреля 2011

Предполагая SQL Server 2005+, вы можете использовать предложение OUTPUT, чтобы сделать это за одну атомарную операцию (см. Использование таблиц в качестве очередей ).

 ;with cte as (
    select top(1) 
      serial, InUse
    from tblSerial with (rowlock, readpast)
    where InUse <> 1
    order by serial
   )
 update cte 
 set InUse = 1 
 output inserted.serial

Редактировать Только что напомнили о способе выполнения этого, который может напрямую назначаться параметру output без использования предложения OUTPUT.

 with cte as (
    select top(1) 
      serial, InUse
    from tblSerial with (rowlock, readpast)
    where InUse <> 1
    order by serial
   )
 update cte 
 set InUse = 1, @serial = serial 
1 голос
/ 04 апреля 2011

Убедитесь, что вы запускаете его с уровнем изоляции транзакции «Повторяемое чтение»:

set transaction isolation level repeatable read

Затем запустите хранимую процедуру в транзакции, и она будет изолирована от других изменений.

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