快速(我認爲)關於實體框架如何參與DTC交易的問題。使用實體框架提交然後在DTC中查詢?
如果我在同一個分佈式事務中創建兩個DbContext,那麼我保存在第一個上下文中的數據是否可以通過第二個上下文進行後續查詢?
換句話說,在DTC事務中:我通過context1獲取,更改和保存數據,然後創建context2並查詢相同的實體。 context2的未落實數據是否可用於context2?
快速(我認爲)關於實體框架如何參與DTC交易的問題。使用實體框架提交然後在DTC中查詢?
如果我在同一個分佈式事務中創建兩個DbContext,那麼我保存在第一個上下文中的數據是否可以通過第二個上下文進行後續查詢?
換句話說,在DTC事務中:我通過context1獲取,更改和保存數據,然後創建context2並查詢相同的實體。 context2的未落實數據是否可用於context2?
這取決於您使用的隔離級別。
如果您將DbContexts包含在TransactionScope中並且指定了IsolationLevel.ReadUncommitted,例如,
var options = new TransactionOptions{ IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted };
using(var scope= new TransactionScope(TransactionScopeOption.Required, options))
{
... DbContexts here
scope.Complete();
}
然後您的第二個查詢將能夠看到第一個所做的更改。 對於其他隔離級別,他們不會。
SQL Server的默認隔離級別是Read Committed,但對於TransactionScope是Serializable。
查看http://www.gavindraper.co.uk/2012/02/18/sql-server-isolation-levels-by-example/的一些例子。
看起來第二個上下文確實可以看到第一個上的更改。我們正在使用讀取提交隔離。我基本上做的(僞代碼):
Start Distributed Transaction
Context1: Fetch data into entities
Context1: Change entities
Context1: Save entities
Context2: Fetch data into same entities as used context 1
Context2: Change entities
Context2: Save entities
Commit Distributed Transaction
當我取的來龍去脈2,我的確看到已保存上下文1的變化,即使他們沒有犯(通過DTC)。