Getting Started
Architecture
NServiceBus
Transports
Persistence
ServiceInsight
ServicePulse
ServiceControl
Monitoring
Samples

Unit of Work

Component: NServiceBus
NuGet Package: NServiceBus (9.x)

Using a transaction scope

If a business transaction is spread across multiple handlers there is always a risk of partial updates since one handler might succeed in updating the data while other won't. To avoid this it is possible to use a unit of work that wraps all handlers in a TransactionScope and makes sure that there are no partial updates. Use following code to enable a wrapping scope:

var unitOfWork = endpointConfiguration.UnitOfWork();
unitOfWork.WrapHandlersInATransactionScope();

Controlling transaction scope options

The following options for transaction scopes used to wrap all handlers can be configured.

Isolation level

NServiceBus will by default use the ReadCommitted isolation level.

Change the isolation level using

var unitOfWork = endpointConfiguration.UnitOfWork();
unitOfWork.WrapHandlersInATransactionScope(
    isolationLevel: IsolationLevel.RepeatableRead);

Transaction timeout

NServiceBus will use the default transaction timeout of the machine the endpoint is running on.

Change the transaction timeout using

var unitOfWork = endpointConfiguration.UnitOfWork();
unitOfWork.WrapHandlersInATransactionScope(
    timeout: TimeSpan.FromSeconds(30));

Or via .config file using a example DefaultSettingsSection.

Implementing custom unit of work

In scenarios, when custom unit of work is needed (e.g. to commit NHibernate transactions, or call SaveChanges on a RavenDB session without polluting handers logic) it can be implemented using a dedicated pipeline behavior.

Samples