1

複数のユーザーが1つの作業項目で作業する場合を防ぐために、悲観的なオフラインロックにロックテーブルを使用したいと思います。アクティブなロックを格納するためのロックテーブルと、ロックとロック解除のための2つのストアドプロシージャを使用しています。

私のロックテーブルの構造は次のとおりです。CaseId(PK)| UserId | LockValidTo。

ロックとロック解除のために、2つのストアドプロシージャを作成しました。1つはロック用、もう1つはロック解除用です。

これは、ロックするためのストアドプロシージャです。

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に投稿されるべきだった場合は申し訳ありません。)

4

1 に答える 1

1

削除 SP の場合、どのエージェントでもロックを削除できますか? また、「SELECT」を使用して SP から ResultSet を返すのはなぜですか? RETURN ステートメントを使用することもできます。

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

于 2012-04-04T20:40:31.387 に答える