2010-06-01 2 views
2

Рассмотрим следующий код:транзакционные NTFS (TxF) на Process.Start()

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

Будут ли изменения, внесенные SQLInstaller.exe будет откатить в этом сценарии? В частности, будут ли изменения, внесенные внешним процессом, запущенным через Process.Start(), обрабатываться TxF?

Спасибо!

+0

Что такое 'using (TransactionScope)'? –

+0

@Darin: псевдокод для реального объекта транзакции, используемого TxF. http://msdn.microsoft.com/en-us/magazine/cc163388.aspx#S6 – Ian

+1

@Darin: Это класс в пространстве имен System.Transactions. Хотя «TransactionScope» активен, объекты, поддерживающие Microsoft, которые поддерживают транзакции, автоматически зачисляются в «текущую» транзакцию в области видимости (если это необходимо, распространяя ее на распределенную транзакцию). Некоторые сторонние компоненты также будут ее поддерживать, а вы если вы решите сделать это, можете автоматически набирать собственные объекты. Когда «TransactionScope» расположен, если метод 'Complete()' не был вызван, все заверенные транзакции автоматически откатываются назад. – Toby

ответ

1

Начальный процесс не будет автоматически выполнять свою работу с транзакциями.

Это действительно вопрос о том, является ли модель неявным или явно. Мы выбрали явную модель специально потому, что неявная модель чрезвычайно трудно рассуждать. Рассмотрим, например, каково было бы, если бы созданный процесс погас и сделал вызов RPC, который не транслировал транзакцию: будет ли клиент и сервер RPC иметь последовательные взгляды на мир?

Короткий ответ: нет.

0

Сомнительный. Внешний процесс абсолютно не знает вашего объема транзакции. Если бы вы были корером внешнего процесса и имели способ обойти ручку транзакции, конечно, но в этом случае очень маловероятно.

0

Все зависит от способа получения дескриптора файла. Если вы откроете файл с помощью простого File.OpenWrite или любого из стандартных методов обработки файлов .NET, вы можете быть уверены, что его доступ не будет транзакционным. CreateFileTransacted необходимо использовать каждый раз, когда вы пытаетесь открыть дескриптор.

Смежные вопросы