在 TransactionScope 中使用 await 會發生 「TransactionScope 必須在當初建立所在的執行緒上進行配置」錯誤訊息,本文以此錯誤來檢視 async / await 機制與流程,並且透過設定來排除 Task 或 async/await 這類非同步作業所產生的跨執行續交易問題。
2017-10-12
在 TransactionScope 中使用 await 會發生 「TransactionScope 必須在當初建立所在的執行緒上進行配置」錯誤訊息,本文以此錯誤來檢視 async / await 機制與流程,並且透過設定來排除 Task 或 async/await 這類非同步作業所產生的跨執行續交易問題。
測試過程中發現若使用 ProfiledDbConnection 包裝原本 DB 連線後,預期的非同步效果就會消失,感覺似乎在每筆 DB 查詢後都立即 await 獲得資料,因此在上線時除了關閉 NanoProfiler 結果頁外,也要記得調整回系統原本的 DB 連線方式。
在 Web API 執行過程中可能需要一次對資料庫提出數個操作需求,當這些查詢彼此沒有順序相依性時,就可以善用非同步的機制讓所有查詢盡可能一次送出,而最終只需花費單一最長查詢所需要的時間即可獲得所有查詢的結果,對於效能的提升相當有幫助。