【问题标题】:Entity Framework - pessimistic locking实体框架 - 悲观锁定
【发布时间】:2011-10-03 12:51:50
【问题描述】:

我要做的基本上是what NHibernate does,当您执行以下操作时:

var instance = session.Get<Customer>(id, LockMode.Upgrade);

我需要锁定数据库中的实体行。为什么我需要那个? 想象一个工作流实例,它可以由多个参与者(人或流程)同时更新。

我的约束不允许乐观锁定解决方案。

【问题讨论】:

    标签: sql-server entity-framework-4 ef-code-first


    【解决方案1】:

    EF 对此不提供支持。如果您想通过查询锁定某些记录,您必须执行以下操作:

    using (var scope = new TransactionScope(...))
    {
        using (var context = new YourContext(...))
        {
            var customer = 
                context.ExecuteStoreQuery<Customer>("SELECT ... FROM Customers WITH (UPDLOCK) WHERE ...");
    
            // rest of your logic while record is locked
    
            scope.Complete();
        }
    }
    

    如果是 DbContext API,则为 context.Database.SqlQuery

    【讨论】:

      【解决方案2】:

      如果您不想在 C# 代码中使用纯 SQL(请参阅 here),也可以将 SQL 代码移动到 EDMX 存储模型:

      <Function Name="LockTestTable" IsComposable="false">
          <CommandText>
              SELECT NULL
              FROM TestTable WITH (UPDLOCK)
              WHERE TestTableID = @testTableID
          </CommandText>
          <Parameter Name="testTableID"
              Mode="In"
              Type="int" />
      </Function>
      

      然后这样称呼它

      using (var scope = new TransactionScope(...))
      {
          using (var context = new YourContext(...))
          {
              context.LockTestTable(1);
      
              // Record locked
      
              scope.Complete();
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-04-02
        • 2013-12-07
        • 1970-01-01
        • 2017-10-10
        • 1970-01-01
        • 2010-09-12
        • 2014-08-30
        • 1970-01-01
        相关资源
        最近更新 更多