Beispiel #1
0
        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();
            }
        }
Beispiel #2
0
        /// <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);
        }