In workflow, a transaction is automatically completed when the outermost TransactionScope or TransactedReceiveScope completes. A transaction implicitly rolls back when an unhandled exception propagates across the scope boundary. However, there may be times when it makes sense to explicitly roll back a transaction without having to throw an exception. In this case, you can use the custom rollback activity like the one in this sample to explicitly abort the ambient transaction and provide an optional exception reason.
RollbackActivity is a NativeActivity as it requires access to the execution properties to get the ambient RuntimeTransactionHandle. In the
Execute method, it obtains the RuntimeTransactionHandle and checks whether it is null, which indicates that the activity was used without an ambient run-time transaction. It then obtains the transaction, again checking whether null is present. It is possible to have an ambient RuntimeTransactionHandle without ever initializing a run-time transaction. Finally it aborts the transaction by calling Rollback and specifying either a user-provided exception or a generic exception that states that the activity rolled back the transaction.
The demonstration workflow consists of a TransactionScope whose body prints the transaction status before and after the
RollbackActivity executes. Note that even though the transaction has been rolled back, the TransactionScope executes to completion and does not abort the workflow until the body completes. The workflow is aborted because the AbortInstanceOnTransactionFailure property defaults to true.
To use this sample
Load the TransactionRollback.sln solution in Visual Studio 2010.
Press CTRL+SHIFT+B to build the solution.
Press CTRL+F5 to run the application.
The samples may already be installed on your computer. Check for the following (default) directory before continuing.