2010-06-01 34 views
2

考慮下面的代碼:事務NTFS的Process.Start(TxF的)()

try 
{ 
    using(TransactionScope) 
    { 
     Process.Start("SQLInstaller.EXE"); 
     throw new Exception(); 
     Commit(); 
    } 
} 
catch(Exception ex) 
{ 
//Do something here 
} 

將SQLInstaller.exe所做的更改將在這種情況下回滾?更具體地說,通過Process.Start()啓動的外部進程所做的更改是否由TxF處理?

謝謝!

+0

什麼是「使用(TransactionScope)」? – 2010-06-01 16:00:09

+0

@Darin:TxF使用的實際Transaction對象的僞代碼。 http://msdn.microsoft.com/en-us/magazine/cc163388.aspx#S6 – Ian 2010-06-01 16:04:47

+1

@Darin:它是System.Transactions命名空間中的一個類。當「TransactionScope」處於活動狀態時,Microsoft提供的支持事務的對象將自動登錄到「當前」範圍內的事務中(如有必要,將其提升爲分佈式事務)。某些第三方組件也會支持它,如果您選擇這樣做,可以自動註冊您自己的對象。 當處理'TransactionScope'時,如果沒有調用'Complete()'方法,則所有登記的事務都會自動回滾。 – Toby 2010-06-01 16:17:03

回答

1

啓動過程不會自動執行事務處理。

這實際上是一個模型是隱含顯式的問題。我們選擇了一個明確的模型,因爲隱式模型非常難以推理。例如,考慮一下如果創建的進程關閉併發起了一個RPC調用,而這個調用不會傳遞事務:如果RPC客戶端和服務器有一致的世界觀?

簡答:不。

0

令人懷疑。外部流程完全不瞭解您的交易範圍。如果你是外部過程的編碼者,並且有辦法傳遞事務句柄,當然,但在這種情況下,可能性很小。

0

一切都將取決於如何獲得文件句柄。如果您使用簡單的File.OpenWrite或任何標準的.NET文件操作方法打開文件,那麼您可以確信它的訪問不會是事務性的。每次嘗試打開手柄時都需要使用CreateFileTransacted