質問

同じアプリケーションの2つの異なるインスタンスから同じストアドプロシージャを同時に実行すると、タイミングを出していると思われる問題があり、それを解決するためにできることがあるかどうか疑問に思いましたか?

問題は、SQL Server 2008が自体を処理し、行をロックし、SPSを実行する方法であると思います...私はあまりよく知らないことです。アプリは使用します ADODB.Command spを実行するには。

私は1つのVB6 exeを持っています(App.exe)、1つのサーバーで複数回実行します。このアプリは、そのアプリの次のシーケンス番号を返すデータベース上の保存されたProcを呼び出します。このシーケンス番号フィールドは、アプリケーションのインスタンスにユニークです - テーブルに1行があります(tbl_SequenceNos)実行中のアプリケーションの各インスタンス。

たとえば、実行しているとします: App[a].exeApp[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].exeApp[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列がインデックス化されていることを確認してください。 (これは、この列のみのインデックスのみまたはこのフィールドがインデックスの最初のフィールドであるインデックスを意味します)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top