SQL Server 2008保存Procは、遅延を引き起こすと同時に実行されます
質問
同じアプリケーションの2つの異なるインスタンスから同じストアドプロシージャを同時に実行すると、タイミングを出していると思われる問題があり、それを解決するためにできることがあるかどうか疑問に思いましたか?
問題は、SQL Server 2008が自体を処理し、行をロックし、SPSを実行する方法であると思います...私はあまりよく知らないことです。アプリは使用します ADODB.Command
spを実行するには。
私は1つのVB6 exeを持っています(App.exe
)、1つのサーバーで複数回実行します。このアプリは、そのアプリの次のシーケンス番号を返すデータベース上の保存された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秒間ぶら下がっています(Ado Timeout?)。
各アプリはお互いの行を見ることがないため、これは特別なロックを指定することなく同時に機能すると思いました。私が足りないものはありますか?私はおそらく、テーブルやページ全体ではなく、行のみをロックするために指定する必要があると思いましたか? - デフォルトで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列がインデックス化されていることを確認してください。 (これは、この列のみのインデックスのみまたはこのフィールドがインデックスの最初のフィールドであるインデックスを意味します)