2009-07-29 9 views
6

SQL Server 2000用のストアドプロシージャは、任意の時点で1つのインスタンスしか実行できません。プロシージャが現在実行されていないことを確認する方法はありますか?ストアドプロシージャが同時に2回実行されないようにします。

理想的には、コードは自己完結型で効率的(速い)にしたいと思います。私も、私が検索した

...手順が何らかの理由で失敗した場合、それは常に実行しているとみなされますので、それの存在をチェックするグローバルな一時テーブルを作成するような何かを行うにはしたくない私はドンこれがまだ尋ねられているとは思わない。されている場合は、ごめんなさい。

+0

使用しているSQL Serverのバージョンはどれですか? –

+0

投稿を更新しました。ごめんなさい。 –

答えて

10

すなわち

はい方法があります。 SQL Server Application locksとして知られているものを使用してください。

編集:はいこれもSQL Server 2000で動作します。

+0

私はまだ試していませんが、これは私が必要とする答えのように見えます。ありがとう! –

1

ダミーテーブルをロックするのはどうですか?それは失敗の場合にデッドロックを引き起こさないでしょう。手順のチェックの開始時

+0

これはどのように役立つのか分かりません。あなたはもっと詳しく説明できますか? –

0

データの一部は、手順の最後にそれを

をロックしていない場合は「ロック」されている場合は、データの一部のロックを解除します。

SELECT @IsLocked=IsLocked FROM CheckLockedTable Where spName = 'this_storedProcedure' 

IF @IsLocked = 1 
    RETURN 
ELSE 
    UPDATE CheckLockedTable SET IsLocked = 1 Where spName = 'this_storedProcedure' 

. 
. 
. 

-- At end of Stored Procedure 
    UPDATE CheckLockedTable SET IsLocked = 0 Where spName = 'this_storedProcedure' 
+0

これはどのようにして達成できますか? –

+0

良い解決策ですが自己完結型ではありません... –

5

ロックa Stored Procedure for Single Use Onlyの例のように、sp_getapplocksp_releaseapplockを使用できます。

しかし、あなたが実際にやろうとしていることはありますか?あなたはhigh isolation levelで取引をしようとしていますか?また、一般的な高水準言語では、そのようなことのためにはるかに優れたプリミティブがあるように、アプリケーションレベルで並行処理のタイプを処理するほうがずっと良いでしょう。

関連する問題