だから私は、一種のDALとして使用されるこのEntity Frameworkプロジェクトに取り組んでおり、ストレステストを実行するとき(Thread()を介してエンティティのいくつかの更新を開始する)、これらを取得しています:
_innerException = {"トランザクション (プロセス ID 94) は、別のプロセスとのロック リソースでデッドロックされ、デッドロックの犠牲者として選択されました。トランザクションを再実行してください。"}
クラスのメソッドをどのように実装したかの例を次に示します。
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 の初心者です。しかし、私の問題はむしろコンテキストの設計上の問題だと思います。
ここで誰かが、コンテキストが共有されていなければ、これらのデッドロックの問題に遭遇しないと述べたことを覚えています。
各メソッドでnew BackEndEntities() を使用しているため、これは「共有」されているようには見えません。より堅牢にするために何を変更する必要がありますか?
この DAL は、インターネット上で公開される Web サービスで使用されるため (クールなコード レビューの後)、どれだけストレスがかかるかを制御できず、多くの異なるインスタンスが同じエンティティを更新する可能性があります。
ありがとう!