Хранимая процедура SQL Server 2008 работает одновременно, вызывая задержки - PullRequest
2 голосов
/ 01 декабря 2011

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

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

У меня есть один VB6 exe (App.exe), работающий на одном сервере несколько раз.Это приложение вызывает сохраненный процесс в базе данных, который возвращает следующий порядковый номер для этого приложения.Это поле порядкового номера уникально для экземпляра приложения - в таблице по 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 секунд (время ожидания ADO?).

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

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

1 Ответ

2 голосов
/ 01 декабря 2011

Ваша процедура не является поточно-ориентированной и будет давать неверные результаты, поскольку между select и обновлением несколько потоков могут получить одну и ту же последовательность 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 проиндексирован. (Это означает индекс только для этого столбца или индекс, где это поле является первым полем в вашем индексе)

...