SQL Server 2008 сохраненный Proc, работающий одновременно, вызывая задержки

StackOverflow https://stackoverflow.com/questions/8340081

Вопрос

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

Я считаю, что проблема заключается в том, как SQL Server 2008 обрабатывает себя, блокируя ряды и выполняет SPS ... вещи, о которых я на самом деле не знаю. Приложение использует ADODB.Command выполнить SP.

У меня есть один vb6 Exe (App.exe), работая на одном сервере несколько раз. Это приложение вызывает сохраненную Proc в базе данных, которая возвращает следующий номер последовательности для этого приложения. Это поле номера последовательности уникально для экземпляра приложения - в таблице есть 1 строка (tbl_SequenceNos) для каждого экземпляра запущенного приложения.

Так, например, скажем, мы работаем: App[a].exe а также App[b].exe

tblSequenceNos похоже:

iAppNo| iNextSequenceNo
  a   |     1234 
  b   |     4567

Хранящаяся процедура для получения следующего номера последовательности относительно проста:

CREATE PROEDURE GetNextSequenceNo (@AppNo varchar(1), @NextSequenceNo int output)
AS
BEGIN
    DECLARE @TempSequenceNo int

    SELECT @NextSequenceNo = iNextSequenceNo 
    FROM tblSequenceNos 
    WHERE iAppNo = @AppNo

    @NextSequenceNo = @NextSequenceNo + 1

    UPDATE tblSequenceNos 
    SET iNextSequenceNo = @NextSequenceNo
    WHERE iAppNo = @AppNo

END

Когда оба App[a].exe а также App[b].exe попробуйте запустить эту процедуру, чтобы получить свою NextSequenceNo Ценность, они висят около 30 секунд (Timeout Ado?).

Поскольку каждое приложение никогда не смотрит на строку друг друга, я думал, что это будет работать одновременно, не определяя специальную блокировку. Что -то мне не хватает? Я думал, что, возможно, мне нужно указать только для блокировки строки, а не всю таблицу или страницу? - Я не знаю, что делает SQL2008 по умолчанию.

Любая помощь очень ценится! Заранее спасибо, Эндрю

Это было полезно?

Решение

Ваша процедура не безопасна потока и даст неверные результаты, потому что между выберите и обновлением несколько потоков могут получить одинаковую последовательность NR.

CREATE PROCEDURE GetNextSequenceNo (@AppNo varchar(1), @NextSequenceNo int output)
AS

 DECLARE @var table(seq int);

 UPDATE tblSequenceNos 
    SET iNextSequenceNo = @NextSequenceNo + 1
 OUTPUT inserted.iNextSequenceNo INTO @var;
  WHERE iAppNo = @AppNo

  select @NextSequenceNo = seq from @var
GO  

Также убедитесь, что ваш столбец iappno индексирован. (Это означает индекс только в этом столбце или индекс, где это поле является первым полем в вашем индексе)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top