public async Task Send(T context, IPipe <T> next) { SystemTransactionContext systemTransactionContext = null; context.GetOrAddPayload <TransactionContext>(() => { systemTransactionContext = new SystemTransactionContext(_options); return(systemTransactionContext); }); try { await next.Send(context).ConfigureAwait(false); if (systemTransactionContext != null) { await systemTransactionContext.Commit().ConfigureAwait(false); } } catch (Exception ex) { systemTransactionContext?.Rollback(ex); throw; } finally { systemTransactionContext?.Dispose(); } }
/// <summary> /// Create a transaction context for enlisting a session with a <see cref="System.Transactions.Transaction"/>, /// and enlist the context in the transaction. /// </summary> /// <param name="session">The session to be enlisted.</param> /// <param name="transaction">The transaction into which the context has to be enlisted.</param> /// <returns>The created transaction context.</returns> protected virtual ITransactionContext CreateAndEnlistMainContext( ISessionImplementor session, System.Transactions.Transaction transaction) { var transactionContext = new SystemTransactionContext( session, transaction, SystemTransactionCompletionLockTimeout, UseConnectionOnSystemTransactionPrepare); transactionContext.EnlistedTransaction.EnlistVolatile( transactionContext, UseConnectionOnSystemTransactionPrepare ? EnlistmentOptions.EnlistDuringPrepareRequired : EnlistmentOptions.None); return(transactionContext); }