public EtlTransactionScope(IEtlContext context, IProcess process, TransactionScopeKind kind, TimeSpan scopeTimeout, LogSeverity logSeverity)
    {
        Context     = context;
        Process     = process;
        Kind        = kind;
        LogSeverity = logSeverity;
        Timeout     = scopeTimeout;

        if (Kind == TransactionScopeKind.None)
        {
            return;
        }

        var previousId = Transaction.Current?.ToIdentifierString();

        if (Kind == TransactionScopeKind.Suppress && previousId == null)
        {
            return;
        }

        _scope = new TransactionScope((TransactionScopeOption)Kind, scopeTimeout);

        var newId = Transaction.Current?.ToIdentifierString();

        var iocUid = 0;

        switch (kind)
        {
        case TransactionScopeKind.RequiresNew:
            iocUid = Context.RegisterIoCommandStart(Process, IoCommandKind.dbTransaction, null, null, "new transaction started", newId, null,
                                                    "new transaction started");
            break;

        case TransactionScopeKind.Required:
            iocUid = previousId == null || newId != previousId
                    ? Context.RegisterIoCommandStart(Process, IoCommandKind.dbTransaction, null, null, "new transaction started", newId, null,
                                                     "new transaction started")
                    : Context.RegisterIoCommandStart(Process, IoCommandKind.dbTransaction, null, null, "new transaction started and merged with previous", newId, () => new[] { new KeyValuePair <string, object>("previous transaction", previousId) },
                                                     "new transaction started and merged with previous");

            break;

        case TransactionScopeKind.Suppress:
            iocUid = Context.RegisterIoCommandStart(Process, IoCommandKind.dbTransaction, null, null, "transaction suppressed", previousId, null,
                                                    "existing transaction suppressed");
            break;
        }

        Context.RegisterIoCommandSuccess(Process, IoCommandKind.dbTransaction, iocUid, null);
    }
Esempio n. 2
0
 public EtlTransactionScope BeginScope(IProcess process, TransactionScopeKind kind, LogSeverity logSeverity)
 {
     return(new EtlTransactionScope(this, process, kind, TransactionScopeTimeout, logSeverity));
 }