File: System\Transactions\Oletx\OletxDependentTransaction.cs
Web Access
Project: src\src\runtime\src\libraries\System.Transactions.Local\src\System.Transactions.Local.csproj (System.Transactions.Local)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System;
using System.Diagnostics;
using System.Threading;

namespace System.Transactions.Oletx;

[Serializable]
internal sealed class OletxDependentTransaction : OletxTransaction
{
    private readonly OletxVolatileEnlistmentContainer _volatileEnlistmentContainer;

    private int _completed;

    internal OletxDependentTransaction(RealOletxTransaction realTransaction, bool delayCommit)
        : base(realTransaction)
    {
        ArgumentNullException.ThrowIfNull(realTransaction);

        _volatileEnlistmentContainer = RealOletxTransaction.AddDependentClone(delayCommit);

        TransactionsEtwProvider etwLog = TransactionsEtwProvider.Log;
        if (etwLog.IsEnabled())
        {
            etwLog.TransactionDependentCloneCreate(TraceSourceType.TraceSourceOleTx, TransactionTraceId, delayCommit
                ? DependentCloneOption.BlockCommitUntilComplete
                : DependentCloneOption.RollbackIfNotComplete);
        }
    }

    public void Complete()
    {
        TransactionsEtwProvider etwLog = TransactionsEtwProvider.Log;
        if (etwLog.IsEnabled())
        {
            etwLog.MethodEnter(TraceSourceType.TraceSourceOleTx, this, $"{nameof(DependentTransaction)}.{nameof(Complete)}");
        }

        Debug.Assert(Disposed == 0, "OletxTransction object is disposed");

        int localCompleted = Interlocked.Exchange(ref _completed, 1);
        if (localCompleted == 1)
        {
            throw TransactionException.CreateTransactionCompletedException(DistributedTxId);
        }

        if (etwLog.IsEnabled())
        {
            etwLog.TransactionDependentCloneComplete(TraceSourceType.TraceSourceOleTx, TransactionTraceId, "DependentTransaction");
        }

        _volatileEnlistmentContainer.DependentCloneCompleted();

        if (etwLog.IsEnabled())
        {
            etwLog.MethodExit(TraceSourceType.TraceSourceOleTx, this, $"{nameof(DependentTransaction)}.{nameof(Complete)}");
        }
    }
}