EF可以锁定表吗?

时间:2017-08-28 11:20:53

标签: asp.net sql-server entity-framework multiprocessing

我有多个服务使用相同的表,我想使用EF锁定表,如果某些服务已经在使用它。

我尝试在下面的解决方案的帮助下做到这一点,但它没有工作

How can I lock a table on read, using Entity Framework?

了解更多信息

我尝试使用来自" Service 1"同时我使用" Service 2" 调用相同的函数,但它仍然从表中检索数据。

**我想要"服务1"呼叫功能然后表已经锁定"服务2"无法检索数据或做任何事情都可以吗?

using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = IsolationLevel.RepeatableRead }))
{
       var newUrl = dbEntity.URLs.FirstOrDefault(url => url.StatusID == (int) URLStatus.New);
       if(newUrl != null)
       {
            newUrl.StatusID = (int) URLStatus.InProcess;
            dbEntity.SaveChanges();
       }

       scope.Complete();
}

1 个答案:

答案 0 :(得分:0)

没有事务隔离级别可以做到这一点。最简单的方法是使用Application Lock。 Application Lock就像一个全局Mutex,只允许一台客户端计算机运行一段代码。请注意,此代码不必是数据库代码。您可以使用应用程序锁定为客户端提供对文件或其他资源的独占访问权。

像这样:

例如

using (var tran = db.Database.BeginTransaction(System.Data.IsolationLevel.ReadCommitted))
{
    var lockName = "MyLock";
    db.Database.ExecuteSqlCommand($"exec sp_getapplock '{lockName}', 'exclusive'");

    // do stuff

    tran.Commit();
}