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 void Intercept(IInvocation invocation) { MethodInfo methodInfo = invocation.MethodInvocationTarget; if (methodInfo == null) { methodInfo = invocation.Method; } //we take the settings from the first attribute we find searching method first //If there is at least one attribute, the call gets wrapped with a transaction Type attributeType = GetAttributeType(); var classAttributes = (ITransactionAttributeSettings[]) methodInfo.ReflectedType.GetCustomAttributes(attributeType, false); var methodAttributes = (ITransactionAttributeSettings[]) methodInfo.GetCustomAttributes(attributeType, false); if (classAttributes.Length == 0 && methodAttributes.Length == 0) { invocation.Proceed(); } else { TransactionAttributeSettings transactionAttributeSettings = GetTransactionAttributeSettings(methodAttributes, classAttributes); object transactionState = OnEntry(transactionAttributeSettings, null); try { invocation.Proceed(); } catch (Exception err) { CloseUnitOfWork(transactionAttributeSettings, transactionState, err); if (!(err is AbortTransactionException)) { exceptionLogger.LogException(err, transactionAttributeSettings.IsExceptionSilent, methodInfo.ReflectedType); } if (transactionManager.TransactionDepth == 0 && (transactionAttributeSettings.IsExceptionSilent || err is AbortTransactionException)) { invocation.ReturnValue = transactionAttributeSettings.ReturnValue; return; } throw; } transactionState = OnSuccess(transactionAttributeSettings, 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); }
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); }
private object OnEntry(TransactionAttributeSettings transactionAttributeSettings, object transactionState) { return(transactionManager.PushTransaction(transactionAttributeSettings.FactoryKey, transactionState)); }
private object OnSuccess(TransactionAttributeSettings transactionAttributeSettings, object transactionState) { return(CloseUnitOfWork(transactionAttributeSettings, transactionState, null)); }
public TransactionAttribute() { this.attributeSettings = new TransactionAttributeSettings(); }
public UnitOfWorkAttribute() { this.settings = new UnitOfWorkAttributeSettings(); }