1

我正在将一个网站移动到多个实例。这意味着我不能再使用 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 语句中的任何数据库访问,这很糟糕。

4

1 回答 1

1

查看 SQL Server applocks - 正是您需要的(尝试锁定命名资源)。

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

我们为此编写了一个小的 IDisposable 包装器,以使获取和清理更容易。

于 2012-09-26T19:58:44.883 回答