1

Webサイトを複数のインスタンスに移動しています。これはlock、サービスがそれ自体の上で実行されないことを確認するために、もう使用できないことを意味します。したがって、インスタンス間でロックする方法が必要です。

おそらくメッセージキューを備えたバックグラウンドワーカーを使用する必要がありますが、この1つのサービスではやり過ぎだと感じています。どういうわけかデータベーストランザクションをロックとして使用できるかどうか疑問に思っています。私はスピードを気にしません-私はそれがシンプルで機能することを望んでいます。

これが私がやろうと思っていることです:

public class MultiInstanceLock : IDisposable
{
    private readonly string lockId;
    private Transaction transaction;
    private LockEntity lockEntity;

    public MultiInstanceLock(String _lockId)
    {
        lockId = _lockId;

        transaction = new Transaction(IsolationLevel.RepeatableRead, lockId);
        lockEntity = new LockEntity(lockId);
        if(lockEntity.IsNew)
            lockEntity.Id = lockId;

        lockEntity.LockedOn = DateTime.Now;
        lockEntity.Save();
    }

    public void Dispose()
    {
        if (lockEntity != null)
        {
            lockEntity.UnlockedOn = DateTime.Now;
            lockEntity.Save();
        }

        if(transaction != null)
            transaction.Commit();
    }
}

使用法は次のとおりです。

using(var l = new MultiInstanceLock("Foo"))
{
    ...do foo...
}

これは機能しますか?もっと良い方法はありますか?

すでに、トランザクションがusingステートメント内のすべてのDBアクセスに適用されることに気付いていますが、これは残念です。

4

1 に答える 1

1

SQL Serverのapplocksを見てください-まさに必要なものです(名前付きリソースをロックしようとします)。

http://msdn.microsoft.com/en-us/library/ms189823.aspx

取得とクリーンアップを容易にするために、この周りに小さなIDisposableラッパーを作成しました。

于 2012-09-26T19:58:44.883 に答える