2010-04-29 38 views
1

爲了從未受髒數據影響的應用程序的一部分中選擇數據,我創建了一個TransactionScope,該TransactionScope指定一個ReadUncommitted IsolationLevel來自Hanselman的建議here僅存在用於選擇數據的TransactionScope是否需要調用Complete()

我的問題是,我仍然需要在使用塊的末尾執行oTS.Complete()調用,即使此事務作用域不是爲了在插入過程中跨2個數據庫橋接對象依賴性而構建的,更新或刪除?

例:

List<string> oStrings = null; 
using (SomeDataContext oCtxt = new SomeDataContext (sConnStr)) 
using (TransactionScope oTS = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted })) 
{ 
    oStrings = oCtxt.EStrings.ToList(); 
    oTS.Complete(); 
} 
+0

從http://msdn.microsoft.com/en-us/library/ms172152.aspx開始,「當TransactionScope對象加入現有的環境事務時,處置範圍對象可能不會結束事務,除非範圍中止如果環境事務是由根作用域創建的,那麼只有當根作用域被處理時,Commit纔會被調用到事務上,如果事務是手動創建的,事務會在中止或者被提交時結束它的創造者「。 – fordareh 2010-04-29 19:49:57

回答

5

如果沒有改變任何數據,那麼就不會本身做任何事情 - 不過是:它應該一個Complete(),因爲有可能是一個交易範圍外圍圍繞這一個。如果你的回滾,你註定了整個外部交易。通過完成您的交易,您可以讓外部交易繼續不受阻礙地繼續。

請注意,在這種情況下,Complete()是「免費」的;事實上SQL Server 總是優化爲Complete(),回滾(Dispose()沒有Complete())是昂貴的。

1

是的。一個事務只能以完成或回滾結束,所以如果你沒有完成它,它會自動回滾。即使沒有實際的撤銷更改,這可能會更加昂貴,並且可能會影響其他交易。

相關問題