Пройти текущую транзакцию или использовать DependentClone? - PullRequest
0 голосов
/ 25 июня 2009

У меня есть приложение WinForm, которое использует SqlServer CE 3.5 в качестве базы данных. Я использую типизированные запросы к наборам данных для операций с БД. Мне нужно использовать транзакции для этой операции. Проблема в том, что они разбросаны по разным сборкам. У меня вопрос, что я должен использовать для запуска всех из них в одной транзакции? Вот пример операции:

//transaction should start here
this.QueryDb();
MyOtherAssembly.myClass.QueryDbForSomethingElse();
System.IO.File.Delete(fileName);
//end transaction

Я думаю об использовании TransactionScope но сработает ли это в этой ситуации? Я имею в виду QueryDbForSomethingElse() откат, если File.Delete() потерпит неудачу? Должен ли я передать Transaction.Current или Transaction.Current.DependentClone(DependentCloneOption.BlockCommitUntilComplete) в качестве параметра и создать новую транзакцию, используя переданный параметр?

Буду признателен за любые идеи по этому поводу.

1 Ответ

0 голосов
/ 25 июня 2009

TransactionScope работает между сборками - ему действительно все равно , где код реализован. Скорее, он привязан к текущему контексту выполнения (текущему потоку, если я не ошибаюсь).

Однако файловая система Windows не является транзакционной, поэтому независимо от того, как вы пытаетесь зарегистрировать свой код в транзакции, файловые операции не будут принимать в этом никакого участия. Пока мы не получим транзакционную файловую систему, вы не сможете написать приложение, которое гарантирует ACID-транзакции, если задействованы файловые операции.

Вместо этого вам явно придется реализовать компенсирующие действия.

FWIW, однако, возможно, вы захотите взглянуть на статью MSDN Magazine Джувала Лоуи Can't Commit? Управляющие энергозависимыми ресурсами в .NET переводят транзакции в общий тип .

...