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アクセスに適用されることに気付いていますが、これは残念です。