0

SQL Server を使用して WinForms 保険見積もりアプリケーションに悲観的ロック パターンを実装することを検討しています。ユーザーが見積もりの​​作業を開始する前に、レコードがロック テーブルに追加されます。完了すると、レコードはテーブルから削除されます。

私の質問は、アプリケーションの制御の及ばない障害が発生した場合にロックが解放されるようにするにはどうすればよいですか? 私は主にクライアント側のネットワーク接続エラーまたは電源障害について考えていますが、無限の可能性があります。

4

1 に答える 1

1

ロック テーブルではなく、セッション レベルのアプリケーション ロック ( https://msdn.microsoft.com/en-us/library/ms189823.aspx ) を検討してください。ロックは、何らかの理由で SQL セッションが終了したとき、または明示的に解放されたときに解放されます。

--acquire lock
DECLARE
      @ReturnCode int
    , @ClientID nvarchar(255) = '12345';

EXEC  @ReturnCode = sp_getapplock
      @Resource = @ClientID
    , @LockMode = N'Exclusive' 
    , @LockOwner = 'Session'
    , @LockTimeout = 0;

IF @ReturnCode < 0
BEGIN
    RAISERROR('Lock for quote not be granted for ClientID %s. Return code=%d', 16, 1, @ClientID, @ReturnCode);
END;

--release lock
DECLARE
      @ReturnCode int
    , @ClientID nvarchar(255) = '12345';

EXEC  @ReturnCode = sp_releaseapplock
      @Resource = @ClientID
    , @LockOwner = 'Session';
于 2015-09-15T02:40:55.260 に答える