Ejemplo n.º 1
0
        public async Task <TransactionParticipantId> RegisterTransactionParticipantAsync(CancellationToken cancellationToken)
        {
            await this.VerifyStatusActiveAsync((id, status) => "RegisterTransactionParticipantAsync is only available when a transaction is in active state. Current state: " + status, cancellationToken);

            var participantId = new TransactionParticipantId(Guid.NewGuid());

            await this.AddTransactionParticipantAsync(participantId, cancellationToken);

            return(participantId);
        }
        public static async Task AddTransactionParticipantAsync(
            this TransactionManager transactionManager,
            TransactionParticipantId transactionParticipantId,
            CancellationToken cancellationToken = default(CancellationToken))
        {
            var participants = await transactionManager.GetTransactionParticipantsAsync(cancellationToken);

            if (!participants.Contains(transactionParticipantId))
            {
                participants = participants.Add(new TransactionParticipant(transactionParticipantId, TransactionParticipantStatus.Added));
            }

            await transactionManager.SetTransactionParticipantsAsync(participants, cancellationToken);
        }
Ejemplo n.º 3
0
        public async Task ReportTransactionParticipantRolledBackAsync(TransactionParticipantId transactionParticipantId, CancellationToken cancellationToken)
        {
            await this.VerifyStatusAsync((id, status) => status == TransactionStatus.RollbackStarted, (id, status) => "ReportTransactionParticipantRolledBackAsync is only available when a transaction is rollback started state. Current state: " + status, cancellationToken);

            var participants = await this.GetTransactionParticipantsAsync(cancellationToken);

            participants.Replace(new TransactionParticipant(transactionParticipantId, TransactionParticipantStatus.Rolledback));
            await this.SetTransactionParticipantsAsync(participants, cancellationToken);

            if (participants.All(p => p.TransactionParticipantStatus == TransactionParticipantStatus.Committed))
            {
                await this.SetTransactionStateStatusAsync(TransactionStatus.RollbackDone, cancellationToken);

                await this.StopTransactionRollbackNotificationAsync();

                await this.StopTransactionTimeoutReminderAsync();
            }
        }
Ejemplo n.º 4
0
        public async Task ReportTransactionParticipantCommittedAsync(TransactionParticipantId transactionParticipantId, CancellationToken cancellationToken)
        {
            await this.VerifyStatusAsync((id, status) => status == TransactionStatus.CommitStarted, (id, status) => "ReportTransactionParticipantCommittedAsync is only available when a transaction is committing state. Current state: " + status, cancellationToken);

            var participants = await this.GetTransactionParticipantsAsync(cancellationToken);

            participants.Replace(new TransactionParticipant(transactionParticipantId, TransactionParticipantStatus.Committed));
            await this.SetTransactionParticipantsAsync(participants, cancellationToken);

            if (participants.All(p => p.TransactionParticipantStatus == TransactionParticipantStatus.Committed))
            {
                // Commit was a success
                await this.SetTransactionStateStatusAsync(TransactionStatus.Committed, cancellationToken);

                await this.StopTransactionCommitNotificationAsync();

                await this.StopTransactionTimeoutReminderAsync();
            }
        }
Ejemplo n.º 5
0
 public async Task UnregisterTransactionParticipantAsync(TransactionParticipantId transactionParticipantId, CancellationToken cancellationToken)
 {
     throw new NotImplementedException();
 }
 /// <summary>Determines whether a sequence contains a specified element by using the default equality comparer.</summary>
 /// <param name="transactionParticipantId">The transaction participant id to look for.</param>
 /// <returns>true if the transaction participants contains the specified transaction participant id; otherwise, false.</returns>
 public bool Contains(TransactionParticipantId transactionParticipantId)
 {
     return(this.transactionParticipants.Any(tp => tp.TransactionParticipantId.Equals(transactionParticipantId)));
 }
 public TransactionParticipant(TransactionParticipantId transactionParticipantId, TransactionParticipantStatus transactionParticipantStatus = TransactionParticipantStatus.Added)
 {
     this.TransactionParticipantId     = transactionParticipantId;
     this.TransactionParticipantStatus = transactionParticipantStatus;
 }