예제 #1
0
        protected override void OnScopeEnd(DACScope rootScope, bool inException)
        {
            if (!inException && _autoAction.HasValue)
            {
                switch (_autoAction.Value)
                {
                case Auto.Commit:
                    Commit();
                    break;

                case Auto.Rollback:
                    Rollback();
                    break;

                default:
                    throw new NotSupportedException(_autoAction.Value.ToString());
                }
            }
            var scopeWasInOpenTransaction = _scopeHasOpenTransaction;
            var errors = new List <Exception>();

            if (_transaction != null && _scopeOwnsTransaction)
            {
                Tools.Exceptions.ExecuteIgnoringException(CloseTransaction, errors);
            }

            if (_scopeOwnsConnection)
            {
                Tools.Exceptions.ExecuteIgnoringException(_connection.CloseInternal, errors);
                Tools.Exceptions.ExecuteIgnoringException(_connection.DisposeInternal, errors);
                _connection = null;
            }

            if (scopeWasInOpenTransaction && !inException)
            {
                errors.Add(new SoftwareException("DACScope transaction was left open. Please call Commit or Rollback explicitly to close the transaction."));
            }

            if (!inException)
            {
                switch (errors.Count)
                {
                case 0:
                    break;

                case 1:
                    throw errors[0];

                default:
                    throw new AggregateException(errors);
                }
            }
        }
예제 #2
0
        internal DACScope(IDAC dac, ScopeContextPolicy policy, bool openConnection, string contextPrefix = DefaultContextPrefix, Auto?autoAction = null)
            : base(string.Format(ContextNameTemplate, contextPrefix, dac.ConnectionString), policy)
        {
            if (dac == null)
            {
                throw new ArgumentNullException("dac");
            }
            DAC = dac;
            if (IsRootScope)
            {
                _connection = new RestrictedConnection(DAC.CreateConnection());
                if (openConnection)
                {
                    _connection.Open();
                }
                _scopeOwnsConnection  = true;
                _transaction          = null;
                _scopeOwnsTransaction = false;
                _transactionOwner     = null;
            }
            else
            {
                if (RootScope._connection == null)
                {
                    throw new SoftwareException("Internal Error: RootScope DAC had null connection");
                }

                _connection           = RootScope._connection;
                _transaction          = RootScope._transaction;
                _transactionOwner     = RootScope._transactionOwner;
                _scopeOwnsTransaction = false;
                _scopeOwnsConnection  = false;
                if (openConnection && _connection.State.IsIn(ConnectionState.Closed, ConnectionState.Broken))
                {
                    _connection.Open();
                }
            }
            _withinSystemTransactionScope = System.Transactions.Transaction.Current != null;
            if (_scopeOwnsConnection && _withinSystemTransactionScope)
            {
                DAC.EnlistInSystemTransaction(_connection.DangerousInternalConnection, System.Transactions.Transaction.Current);
            }
            _voteRollback            = false;
            _scopeHasOpenTransaction = false;
            _autoAction = autoAction;
        }
예제 #3
0
 public RestrictedTransaction(RestrictedConnection connection, IDbTransaction internalTransaction)
     : base(internalTransaction)
 {
     _connection       = connection;
     HasBeenRolledBack = false;
 }