我們必須閱讀 2 個 select 陳述句需要并行運行,意味著應該一起等待。
var t1 = GetSomeData1(somParams);
var tWrite = await WriteData(someParams);
var t2 = GetSomeData2(somParams);
await Task.WhenAll(t1, t2);
注意 1 寫入介于兩者之間,但在錯誤中我們有時會看到此錯誤,
System.InvalidOperationException:在前一個操作完成之前,在此背景關系上啟動了第二個操作。這通常是由不同的執行緒同時使用同一個 DbContext 實體引起的。有關如何避免 DbContext 執行緒問題的更多資訊,請參閱https://go.microsoft.com/fwlink/?linkid=2097913。在 Microsoft.EntityFrameworkCore.Internal.ConcurrencyDetector.EnterCriticalSection() 在 Microsoft.EntityFrameworkCore.Query.Internal.SingleQueryingEnumerable`1.Enumerator.MoveNext()
按照這個。https://docs.microsoft.com/en-us/ef/ef6/saving/transactions默認事務隔離級別為 READ COMMITED。
我知道 READ COMMITED 中的讀取和寫入會導致阻塞,但是當我們混合讀取和寫入時,我們是否會遇到相同的錯誤。
避免此錯誤并使用并行讀取的建議是什么。
uj5u.com熱心網友回復:
正如它從您的例外中讀取的鏈接:
Entity Framework Core 不支持在同一個 DbContext 實體上運行多個并行操作。這包括異步查詢的并行執行和來自多個執行緒的任何顯式并發使用。因此,請始終立即等待異步呼叫,或者為并行執行的操作使用單獨的 DbContext 實體。
當 EF Core 檢測到嘗試同時使用 DbContext 實體時,您將看到帶有如下訊息的 InvalidOperationException:
在前一個操作完成之前,在此背景關系上開始了第二個操作。這通常是由使用相同 DbContext 實體的不同執行緒引起的,但不能保證實體成員是執行緒安全的。
當并發訪問未被檢測到時,可能會導致未定義的行為、應用程式崩潰和資料損壞。
https://docs.microsoft.com/en-us/ef/core/dbcontext-configuration/#avoiding-dbcontext-threading-issues
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/446706.html
標籤:实体框架
