複数のユーザーが1つの作業項目で作業する場合を防ぐために、悲観的なオフラインロック用のロックテーブルを使用したいと思います。私はアクティブなロックを格納するためのロックテーブルと、ロックとアンロックのための2つのストアドプロシージャを使用しています。これはSQL Serverでロックテーブルを使用するための良いアプローチですか?
私のロックテーブルの構造は次のとおりです。CaseId(PK)|ユーザーID | LockValidTo。
私はロックとアンロックのために、ロック用とロック解除用の2つのストアドプロシージャを作成しました。
これがロックするための私のストアドプロシージャです:
BEGIN
BEGIN TRY
INSERT INTO scs.dbo.caselocks VALUES (@caseId, @agentId, dateadd(n, @lockTime, getdate()))
SELECT 0
END TRY
BEGIN CATCH
SELECT 1
END CATCH
END
そして、これはロックを除去するためのものである:
BEGIN
BEGIN TRY
DELETE FROM scs.dbo.caselocks
WHERE caseid = @caseid
SELECT 0
END TRY
BEGIN CATCH
SELECT 1
END CATCH
END
私の質問は、これは取り扱いロックの適切なアプローチである、ということでしょうか? (申し訳ありませんが、SOの代わりにCode Reviewに投稿する必要があります)
私はこのアプローチがうまくいくと思います。あなたの 'caselocks'テーブルで' CaseId'をPKにすることで競合状態を防ぐことができます。どのくらいの頻度でロックとロック解除を計画していますか?あなたはこのアプローチのパフォーマンスを考えましたか? –
標準のSQL固有のロックで何が問題になっていますか?このアプローチの問題は、プログラムが途切れたり停止したり、またはレコードがロック解除される前に何かが破壊された場合にどうなりますか? – Rodolfo
ユーザーが編集したアイテムに対して作業を完了すると、ロックが解除されます。 (そして、スケジュールされた仕事は、アプリケーションがクラッシュする等の場合にロックをクリーンアップします。)パフォーマンスに関しては、これがどのように実行されるのか本当にわかりません。これにはもっと効率的な方法がありますか? – norbip