我有一個多線程事務和實體框架的問題。我有一個線程,它在事務中運行,我想在同一個事務中有更多的工作線程工作。下面的代碼說明了情況(在EF上下文中有一個虛擬實體,代碼基本上產生了5個線程,我想在每個線程中插入一些實體,並在主線程的末尾,我想繼續使用DB,但是以保持整個過程隔離在一個交易):多線程事務異常終止與實體框架
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()後,但林不知道。任何想法爲什麼交易中止?
但我不明白的是,如果我沒有事務執行該代碼,它的工作原理。我正在爲每個線程創建新的數據庫上下文,並且我相信DependentTransaction應該用於跨線程共享事務 - [link](http://msdn.microsoft.com/zh-CN/LIbrary/system.transactions .dependenttransaction(v = vs.110)) –
在仔細檢查你的代碼後,我看到你在做什麼。這確實可行,但我仍然認爲這是開發系統的一種可怕方式。你試圖解決什麼問題? – Steven
這不是我的生產代碼的工作方式。我的目標是做一些單元集成測試。我正在測試針對MSSQL服務器的業務邏輯層。在測試init方法中,我開始一個事務,然後運行測試代碼,然後檢查數據庫內容。測試完成後,我將回滾事務以保持數據庫處於原始狀態。這種方法完美適用於單線程操作。但是當操作使用多於一個線程時,我需要在這些線程中共享事務。最好不需要更改生產代碼。 –