Namespace System.Transaction, и новый объект TransactionScope делают тривиальной задачу использования транзакций в новых приложениях и добавление поддержки транзакций в существующие (при условии что они были портированы на .NET 2.0).
В моем случае мне надо было добавить поддержку транзакций в приложение, используеющее Data Access Application Block (DAAB). В примере из документации по DAAB используется объект DbTransaction. Лично мне этот метод кажется не удобным по сравнению с использованием TransactionScope. Так как объект DbTransaction надо предавать как параметр в вызовы методов ExecuteXxxxx, то нужно организовать flow этого объекта через/между класс(ы) бизнес логики. Особенно это не удобно при добавлении поддержки транзакций к существующему приложению.
При использовании TransactionScope никакого flow объекта через бизнес логику организовывать не надо. Просто надо заключить код, который должен выполнятся в рамках одной транзакции в такую конструкцию:
using(TransactionScope scope = new TransactionScope())
{
DoSomeActionInTransaction();
DoAnotherActionInTheSameTransaction();
scope.Complete();
}
Вот так вот все легко и прозрачно :)
P.S. Еще один дополнительный плюс TransactionScope по сравнению с DbTransaction в том, что он не принадлежит namespace System.Data. Соответственно, поддерживаются не только DB-транзакции. Очень удобно когда бизнес логика и доступ к данным разделены.