Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用SQL Server数据库事务作为C#锁_C#_Asp.net_Sql Server - Fatal编程技术网

使用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机制