嗨,我正在使用 Entity Framework 4.1 代码优先方法。我有继承 MyContainer 的类 DBContext

我有一个流程有 7 个步骤,每个步骤访问许多存储库方法(大约 60 个)。该流程自动或手动执行取决于业务逻辑和用户需求。现在对于自动过程的性能观点,我创建了上下文,即 MyContainer 的对象一次并将其传递给所有方法并在过程结束时处理它并且它的工作正常并提高了性能。但是当这个过程被手动执行时,相同的方法是执行并在方法本身中创建和处置容器。例如下面,但它只是粗略的代码。

public bool UpdateProcess(Process process, MyContainer container = null)
    {
        bool disposeContainer = false;
        if (container == null)
        {
            container = new MyContainer();
            disposeContainer = true;
        }
        var result = SaveProcess(container, process);
        container.SaveChanges();
        if (disposeContainer)
            container.Dispose();
        return result;
    }

对于自动流程事务在流程开始时创建并在流程结束时结束,手动事务在根据用户对 ui 的操作调用的方法中的 bll 创建。现在假设我的自动流程正在运行并且同时用户对 ui 执行了一些操作,我得到异常 "Transaction (Process ID 65) Was Deadlocked On Lock Resources With Another Process 并已被选择”当手动和自动进程同时调用 UpdateProcess() 方法时,我在 container.SaveChanges( )。

任何帮助将不胜感激。

如果我在这个存储库方法中创建一个事务范围,比如
public bool UpdateProcess(Process process, MyContainer container = null)
 {         bool disposeContainer = false;
           if (container == null)
           {
                  container = new MyContainer();
                  disposeContainer = true;
            }
       using(var trans=new TransactionScop(TransactionScopeOption.RequiresNew))
       {
          var result = SaveProcess(container, process);
          container.SaveChanges();
          trans.Complete();
       }
          if (disposeContainer)
          container.Dispose();
          return result;
 }

它工作正常。
但是我不想在存储库中创建事务,因为事务已经在 bll 中进行了。

任何帮助都会得到帮助。

最佳答案

您遇到的问题(sql 死锁)在大多数重要的客户端 - 数据库系统中很常见,并且很难解决。

设计可能发生死锁的代码的主要规则是假设它们会发生并设计应用程序以适本地处理它们。这通常是通过重新提交事务来处理的。如 microsoft here 所述



为了尽量减少任何死锁,你看到我采取的正常方法如下:

  • 运行分析器并启用死锁图以捕获所有死锁
  • 将所有死锁导出为文本并调查它们发生的原因
  • 检查以查看可以通过使用表提示和/或降低转换隔离级别来最小化这些
  • 看看它们是否可以通过其他方式最小化,例如更改操作顺序
  • 最后,在完成所有这些之后,确保您在与数据库通信并重新提交事务/查询等时陷入死锁。
  • 关于c# - 事务死锁和 DBContext,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10629955/

    10-17 02:46