SQL Server 2008 сохраненный Proc, работающий одновременно, вызывая задержки
Вопрос
У меня есть проблема, когда кажется, что при выполнении одной и той же хранимой процедуры одновременно из двух разных экземпляров того же применения, который он выходит, и подумал, что я могу сделать что -нибудь, чтобы решить его?
Я считаю, что проблема заключается в том, как 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 индексирован. (Это означает индекс только в этом столбце или индекс, где это поле является первым полем в вашем индексе)