2012-04-04 3 views
1

複数のユーザーが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に投稿する必要があります)

+0

私はこのアプローチがうまくいくと思います。あなたの 'caselocks'テーブルで' CaseId'をPKにすることで競合状態を防ぐことができます。どのくらいの頻度でロックとロック解除を計画していますか?あなたはこのアプローチのパフォーマンスを考えましたか? –

+0

標準のSQL固有のロックで何が問題になっていますか?このアプローチの問題は、プログラムが途切れたり停止したり、またはレコードがロック解除される前に何かが破壊された場合にどうなりますか? – Rodolfo

+0

ユーザーが編集したアイテムに対して作業を完了すると、ロックが解除されます。 (そして、スケジュールされた仕事は、アプリケーションがクラッシュする等の場合にロックをクリーンアップします。)パフォーマンスに関しては、これがどのように実行されるのか本当にわかりません。これにはもっと効率的な方法がありますか? – norbip

答えて

1

削除SPの場合、どのエージェントでもロックの削除を許可しますか?また、なぜ "SELECT"を使用してSPからResultSetを返すのですか?あなたはRETURN文を使うことができます。

getdate()関数を使用してローカルタイムゾーンで時刻を保持していることがわかりました。これは、複数のタイムゾーンを扱うときや、夏時間に切り替えるときなどに、問題の原因となることがよくあります。ベストプラクティスは、日付/時刻を保持しているときは常にUTC時刻を使用し、時刻ユーザに表示される。

+0

エージェントはロックを削除できません。エージェントが編集モードで作業項目を開こうとすると、ロックとロック解除はアプリケーションによって管理されます。 UTCの使用法とリターンの提案をありがとう。 – norbip

関連する問題