我正在开发一个使用 Entity Framework 作为数据访问层的项目,当运行压力测试(通过 Thread() 开始一些实体更新操作)时会出现以下错误:
_innerException = {"Transaction (Process ID 94) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction."}
以下是我实现类方法的一些示例:
public class OrderController
{
public Order Select(long orderID)
{
using (var ctx = new BackEndEntities())
{
try
{
var res = from n in ctx.Orders
.Include("OrderedServices.Professional")
.Include("Agency")
.Include("Agent")
where n.OrderID == orderID
select n;
return res.FirstOrDefault();
}
catch (Exception ex)
{
throw ex;
}
}
}
public bool Update(Order order)
{
using (var ctx = new BackEndEntities())
{
try
{
order.ModificationDate = DateTime.Now;
ctx.Orders.Attach(order);
ctx.SaveChanges();
return true;
}
catch (Exception ex)
{
throw ex;
}
}
}
}
并且:
public class AgentController
{
public Agent Select(long agentID)
{
using (var ctx = new BackEndEntities())
{
try
{
var res = from n in ctx.Agents.Include("Orders")
where n.AgentID == agentID
select n;
return res.FirstOrDefault();
}
catch (Exception ex)
{
throw ex;
}
}
}
public bool Update(Agent agent)
{
using (var ctx = new BackEndEntities())
{
try
{
agent.ModificationDate = DateTime.Now;
ctx.Agents.Attach(agent);
ctx.ObjectStateManager.ChangeObjectState(agent, System.Data.EntityState.Modified);
ctx.SaveChanges();
return true;
}
catch (Exception ex)
{
throw ex;
}
}
}
}
显然,这里的代码可能可以更好,但我是 EF 新手。但我认为我的问题更多是与上下文设计相关。
我记得这里有人提到过,如果我的上下文不是共享的,我就不会遇到这些死锁问题。
对我来说,这似乎不是“共享”的,因为我在每个方法中都使用了 using new BackEndEntities(),那么我需要改变什么才能使它更加健壮呢?
这个数据访问层将被用于一个暴露在互联网上的 Web 服务(经过代码审查),所以我无法控制它将受到多大的压力,并且许多不同的实例可能想要更新相同的实体。
谢谢!