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); } } }
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; }
public RestrictedTransaction(RestrictedConnection connection, IDbTransaction internalTransaction) : base(internalTransaction) { _connection = connection; HasBeenRolledBack = false; }