你好,我正在使用Entity Framework 4.1的Code First方法。我有一个类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;
}
自动流程的交易会在过程开始时创建,在过程结束时结束。而手动交易是在 BLL 中的方法中根据用户在 UI 上的操作调用后创建的。现在假设我的自动流程正在运行,同时用户在 UI 上执行了一些操作,我就会收到异常信息:“Transaction (Process ID 65) Was Deadlocked On Lock Resources With Another Process And Has Been Chosen”。当从手动和自动流程同时调用 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中进行了。
任何帮助将不胜感激。