/// <summary> /// Runs async commands queue /// </summary> /// <returns></returns> public async Task SaveAsync(OuterTransactionMode transaction = OuterTransactionMode.None, OuterTransactionIsolationLevel level = OuterTransactionIsolationLevel.Chaos) { if (_actions.IsRunning) { throw new Exception(".SaveAsync cannot be called within post-save action"); } if (_finallyActions.IsRunning) { throw new Exception(".SaveAsync cannot be called within finally action"); } IOuterTransaction tran = ObtainTransaction(transaction, level); Exception thrown = null; try { await _serviceManager.OnSaveAsync(); CommandsDispatcher dispatcher = new CommandsDispatcher(_mx, _aux.TraceCollector); await dispatcher.DispatchAsync(_pipeline, _actions); await _serviceManager.OnFinallyAsync(); await _finallyActions.RunAsync(); await dispatcher.DispatchAsync(_pipeline, _actions); tran?.Commit(); //CleanupAfterSave(); } catch (Exception ex) { _exceptionHandler?.Invoke(ex); thrown = ex; } finally { try { tran?.Dispose(); } catch (Exception) { if (thrown == null) { throw; } } if (thrown != null) { throw thrown; } } }
private IOuterTransaction ObtainTransaction( OuterTransactionMode transaction, OuterTransactionIsolationLevel level) { if (_tranManager == null) { return(new FakeOuterTransaction(level)); } if (transaction == OuterTransactionMode.DbTransaction) { return(_tranManager.BeginDbTransaction(level)); } if (transaction == OuterTransactionMode.TransactionScope) { return(_tranManager.BeginDbTransaction(level)); } return(new FakeOuterTransaction(level)); }