マルチスレッド トランザクションとエンティティ フレームワークに問題があります。トランザクションで動作するスレッドがあり、同じトランザクション内でさらにいくつかのワーカー スレッドを動作させたいと考えています。次のコードは状況を示しています (EF コンテキストに 1 つのダミー エンティティがあり、コードは基本的に 5 つのスレッドを生成します。各スレッド内にいくつかのエンティティを挿入し、最後にメイン スレッドで、DB で作業を続けたいと考えていますが、プロセス全体を 1 つのトランザクションに分離するため):
using(var scope = new TransactionScope())
{
int cnt = 5;
ManualResetEvent[] evt = new ManualResetEvent[cnt];
for(int i = 0; i < cnt; i++)
{
var sink = new ManualResetEvent(false);
evt[i] = sink;
var tr = Transaction.Current.DependentClone(
DependentCloneOption.BlockCommitUntilComplete);
Action run = () =>
{
using (var scope2 = new TransactionScope(tr))
{
using (var mc = new ModelContainer())
{
mc.EntitySet.Add(new Entity()
{
MyProp = "test"
});
mc.SaveChanges();
}
}
sink.Set();
};
ThreadPool.QueueUserWorkItem(r => run());
}
ManualResetEvent.WaitAll(evt);
using (var mc = new ModelContainer())
{
Console.WriteLine(mc.EntitySet.Count());
}
Console.ReadKey();
}
問題は、mc.SaveChanges(); で例外がスローされることです。内部例外は TransactionException です: 「操作はトランザクションの状態に対して有効ではありません。」ある時点で、トランザクションが中止されたようです。最初のスレッドが SaveChanges() を呼び出した後だと思いますが、よくわかりません。トランザクションが中止される理由は何ですか?