【问题标题】:Is EF can lock table?EF可以锁表吗?
【发布时间】:2017-08-28 11:20:52
【问题描述】:

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

我尝试在以下解决方案的帮助下做到这一点,但它不起作用

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

更多信息

我尝试在使用“服务 2”的​​同时使用“服务 1”中的此代码 调用相同的函数,但它仍然从表中检索数据。

** 我想要“服务 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();
}

【问题讨论】:

  • 寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:如何创建最小、完整和可验证的示例。
  • 谢谢。我将添加更多信息。

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


【解决方案1】:

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

像这样:

例如

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();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-07
    • 1970-01-01
    • 2011-10-21
    • 1970-01-01
    • 1970-01-01
    • 2022-11-16
    相关资源
    最近更新 更多