我正在将一个网站移动到多个实例。这意味着我不能再使用 alock
来确保服务不会在自身之上运行。所以我需要一种跨实例锁定的方法。
我可能应该使用带有消息队列的后台工作人员,但我觉得这对于这项服务来说太过分了。我想知道我是否可以以某种方式将数据库事务用作锁。我不在乎速度 - 我希望它简单且有效。
这是我想做的事情:
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 语句中的任何数据库访问,这很糟糕。