2016-03-24 17 views
0

こんにちは。複数のユーザーが同時にテーブルを更新できないようにしたい。複数のユーザーが同じSQL Serverストアドプロシージャを同時に実行できないようにする

DB​​テーブル"abd.dbo.xyz"に更新が必要です。私はSQLに新しいですが、私はまだ私の要件を満たしていないコードを書いています。

助けが必要ですか?

use [abc] 
BEGIN TRANSACTION 
DECLARE @res INT 
EXEC @res = sp_getapplock 
@Resource = 'This a Lock ID', 
@LockMode = 'Exclusive', 
@LockOwner = 'Transaction', 
@LockTimeout = 15000, 

IF @res NOT IN (0, 1) 
BEGIN 
    RAISERROR ('Unable to acquire Lock', 16, 1) 
END 
ELSE 
BEGIN 

-- this is update command which i need to run one instance only 
Update abc.dbo.xyz set IsKeyProduct= NULL Where IsKeyProduct is not NULL; 

EXEC @res = sp_releaseapplock 
@Resource = 'This a Lock ID', 
@DbPrincipal = 'public', 
@LockOwner = 'Transaction' 

END 
COMMIT 
+0

の解放を気にする必要はいけないので、限り、トランザクションが実行されているように、ロックを保持するように指示します。テーブルのヒントを確認し、必要な操作を行っているかどうかを確認します。https://technet.microsoft.com/en-us/library/ms187373(v=sql.105).aspx –

+1

これはなぜですか? DBMSがこれを処理します。 – Dane

+0

更新コマンドの代わりに私は終了するのに約60分かかるストアドプロシージャがあります。同時に他のユーザーが同じprocを実行している場合、完了には多くの時間がかかります(90分)。だから私はこの問題を避けたい。 – Ramaq

答えて

0

結果が(0,1)であることを確認しています.1は、プロシージャがロックが解放されるまで待機する必要があることを示しています。あなただけのためにチェックする(0)、それは(そうPROCの他のインスタンスがrunnigなかった)ロックが即時に付与されたことを意味し

最も簡単な方法は、ストアドプロシージャにsp_getapplockを使用することです。

Exec @lokcResult =sp_getapplock @Resource='MyLock', @LockMode='Exclusive', @LockOwner='Transaction', @LockTimeout = 500 

あなたが@lockResultをチェックshuold、それが0に等しくない場合、あなたは何もせずに返す必要があります後。 getapplockのマニュアルを参照してください:https://msdn.microsoft.com/en-us/library/ms189823.aspx

@LockOwner='Transaction'は、あなたが実際にあなたが必要以上の仕事をしてすることができるロック

関連する問題