У меня проблема с многопоточной транзакцией и структурой сущностей. У меня есть поток, который работает в транзакции, и я хотел бы, чтобы еще несколько рабочих потоков работали в одной транзакции. Следующий код иллюстрирует ситуацию (в контексте EF есть одна фиктивная сущность, код в основном порождает 5 потоков, я хотел бы вставить некоторые сущности в каждый поток и в конце в основной поток, я хотел бы продолжить работу с БД, но чтобы весь процесс был изолирован в ОДНОЙ транзакции):
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(), но я не уверен. Любая идея, почему транзакция прерывается?