2017-11-26 12 views
0

SQL Serverでは、トランザクション外でテーブルをロックおよびロック解除する方法(排他的)トランザクションの外部でのみテーブルをロックおよびロック解除する方法

理由:同じ時刻にトランザクション内で実行することはできませんステートメントを実行しながら、私のアプリの複数のインスタンスが

+0

どのようなコンテキストで。 –

+3

ロックは、通常、トランザクションの間のみ保持されます。おそらくあなたが望むのは、セッションレベルのアプリケーションロックです。 –

+0

アプリケーションロックがジョブを実行する可能性があります。私は喜んでそれを解決する答えを受け入れるでしょう。 –

答えて

2

1つのオプションは、sp_getapplockを検討するかもしれない、お互いのつま先を踏むことなく、1つのテーブルと対話する必要がありますおよびsp_releaseapplock

これはテーブルをロックしませんが、任意の名前付きリソースです。次に、ストアドプロシージャなどのロックが取得された後に問題のテーブルでのみ動作するようにアプリケーションを構成できます。 @LockOwner = 'Session'を指定すると、トランザクションの外側で、このロック機構を使用できることを意味します

EXEC sp_getapplock @Resource = 'ResourceName', @LockMode = 'Exclusive', @LockOwner = 'Session' 

-- UPDATE table, etc. 

EXEC sp_releaseapplock @Resource = 'ResourceName', @LockOwner = 'Session' 

この例はようなものになるだろう。

ロックと解放のステートメントを独自のストアドプロシージャに抽出するオプションもあります。そのため、ロジックは一度しか記述されません。これらのストアドプロシージャは、呼び出しが取得/解放されたかどうかを指定する結果を持つ呼び出し側プロシージャに値を戻すことができます。

この時点では、このメカニズムがすべてのプロシージャ/テーブル/ etcに適用されていることを確認するだけの問題です。そこには競合があるかもしれません。

関連する問題