public void ExecuteAllInTransaction() { _logger.LogInformation("Transaction Manager is starting the traction"); int index = 0; bool isRollbackOccur = false; for (index = 0; index < Transactions.Count; index++) { IBuilderTransaction trac = Transactions[index]; string processname = trac.Name; _logger.LogInformation("{0} transaction executing", processname); try { AddTransactionLevelOutputToInput(trac); trac.Execute(); AddOutputToTransactionLevelOutput(trac); } catch (Exception ex) { _logger.LogError(ex.ToString()); isRollbackOccur = true; ExecuteRollBack(index - 1); break; } } if (!isRollbackOccur) { _logger.LogInformation("Transaction completed successfully"); } else { _logger.LogInformation("Transaction completed with Rollback"); } }
private void AddOutputToTransactionLevelOutput(IBuilderTransaction trac) { var tracOutput = trac.Output; foreach (KeyValuePair <string, object> kv in tracOutput) { if (TransactionLevelOutput.ContainsKey(kv.Key)) { TransactionLevelOutput[kv.Key] = kv.Value; } else { TransactionLevelOutput.Add(kv.Key, kv.Value); } } }
private void AddTransactionLevelOutputToInput(IBuilderTransaction trac) { var tracInput = trac.Input; if (tracInput == null) { return; } foreach (KeyValuePair <string, object> kv in TransactionLevelOutput) { if (tracInput.ContainsKey(kv.Key)) { tracInput[kv.Key] = kv.Value; } else { tracInput.Add(kv.Key, kv.Value); } } }
private void ExecuteRollBack(int Index) { for (int index = Index; index >= 0; index--) { IBuilderTransaction trac = Transactions[index]; string processname = trac.GetType().Name; _logger.LogInformation("{0} transaction rollback executing", processname); try { AddTransactionLevelOutputToInput(trac); trac.RollBack(); AddOutputToTransactionLevelOutput(trac); } catch { _logger.LogError("Rollback failed for process {0}", processname); _logger.LogError("Transaction in inconsistant state, manual check required"); throw; } } }
public void AddTraction(IBuilderTransaction trac) { Transactions.Add(trac); }