使用SQL Server数据库事务作为C#锁
我正在将网站移动到多个实例。这意味着我不能再使用使用SQL Server数据库事务作为C#锁,c#,asp.net,sql-server,C#,Asp.net,Sql Server,我正在将网站移动到多个实例。这意味着我不能再使用锁来确保服务不会自行运行。所以我需要一种跨实例锁定的方法 我可能应该在消息队列中使用后台工作程序,但我觉得这项服务太过复杂了。我想知道我是否可以使用数据库事务作为锁。我不在乎速度——我希望它简单实用 以下是我想做的: public class MultiInstanceLock : IDisposable { private readonly string lockId; private Transaction transactio
锁
来确保服务不会自行运行。所以我需要一种跨实例锁定的方法
我可能应该在消息队列中使用后台工作程序,但我觉得这项服务太过复杂了。我想知道我是否可以使用数据库事务作为锁。我不在乎速度——我希望它简单实用
以下是我想做的:
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访问,这很糟糕。看看SQL Server applocks,这正是您需要的(尝试锁定命名资源)
我们为此编写了一个小的IDisposable包装,以使获取和清理更容易。看看SQL Server applocks—这正是您需要的(尝试锁定命名资源)
我们为此编写了一个小的IDisposable包装,以使获取和清理更容易。谢谢Matt-你有机会分享你的包装吗?对不起-我们的包装被绑定到一堆我无法发布的内部基础设施中。不过,这里有一个类似的链接:按照马特的建议,我创建了一个简单的
sp_getapplock
包装器&它工作得非常好:@bendytree如果你还有这个包装器,你能把它添加到你的答案中吗,这正是我想要的。pastie.org在几年前就去世了,另一个例子也是一个死链接:-(对于未来的读者:有一个图书馆提供(分布式的)锁定策略:。分布式信号量锁也基于sp_getapplock机制谢谢Matt-你有没有机会分享你的包装器?对不起-我们的包装器被绑定到一堆我无法发布的内部基础设施中。这里有一个类似的链接:根据Matt的建议,我创建了一个sp_getapplock的简单包装器代码>&它工作得很好:@bendytree如果你还有那个包装器,你能把它添加到你的答案中吗,这正是我想要的。pastie.org在几年前去世了,另一个例子也是一个死链接:-(对于未来的读者:有一个提供(分布式)的库)锁定策略:。分布式信号量锁也基于sp_getapplock机制