protected override object CloseUnitOfWork(TransactionAttributeSettings transactionAttributeSettings,
                                                  object transactionState, Exception err)
        {
            transactionState = base.CloseUnitOfWork(transactionAttributeSettings, transactionState, err);
            if (transactionManager.TransactionDepth == 0) {
                var sessionStorage = (NHibernateSession.Storage as IUnitOfWorkSessionStorage);
                if (sessionStorage != null) {
                    sessionStorage.EndUnitOfWork(
                        ((UnitOfWorkAttributeSettings) transactionAttributeSettings).CloseSessions);
                }
            }

            return transactionState;
        }
        protected virtual object CloseUnitOfWork(TransactionAttributeSettings transactionAttributeSettings,
                                                 object transactionState, Exception err)
        {
            string factoryKey = transactionAttributeSettings.FactoryKey;
            if (err == null) {
                try {
                    NHibernateSession.CurrentFor(factoryKey).Flush();
                    transactionState = transactionManager.CommitTransaction(factoryKey, transactionState);
                }
                catch (Exception) {
                    transactionState = transactionManager.RollbackTransaction(factoryKey, transactionState);
                    transactionState = transactionManager.PopTransaction(factoryKey, transactionState);
                    throw;
                }

            }
            else {
                transactionState = transactionManager.RollbackTransaction(factoryKey, transactionState);
            }
            transactionState = transactionManager.PopTransaction(factoryKey, transactionState);

            return transactionState;
        }
 public UnitOfWorkAttribute()
 {
     this.settings = new UnitOfWorkAttributeSettings();
 }
 public TransactionAttribute()
 {
     settings = new TransactionAttributeSettings();
 }
 private object OnSuccess(TransactionAttributeSettings transactionAttributeSettings, object transactionState)
 {
     return CloseUnitOfWork(transactionAttributeSettings, transactionState, null);
 }
 private object OnEntry(TransactionAttributeSettings transactionAttributeSettings, object transactionState)
 {
     return transactionManager.PushTransaction(transactionAttributeSettings.FactoryKey, transactionState);
 }
 private TransactionAttributeSettings GetTransactionAttributeSettings(
     ITransactionAttributeSettings[] methodAttributes, ITransactionAttributeSettings[] classAttributes)
 {
     var transactionAttributeSettings = new TransactionAttributeSettings();
     if (methodAttributes.Length > 0) {
         transactionAttributeSettings = methodAttributes[methodAttributes.Length - 1].Settings;
     }
     else if (classAttributes.Length > 0) {
         transactionAttributeSettings = classAttributes[classAttributes.Length - 1].Settings;
     }
     return transactionAttributeSettings;
 }