in src/NMS.AMQP/NmsLocalTransactionContext.cs [139:195]
public async Task Commit()
{
if (IsInDoubt())
{
try
{
await Rollback().Await();
}
catch (Exception e)
{
Tracer.WarnFormat("Error during rollback of failed TX: ", e);
}
throw new TransactionRolledBackException("Transaction failed and has been rolled back.");
}
Tracer.Debug($"Commit: {this.transactionInfo.Id}");
var oldTransactionId = this.transactionInfo.Id;
var nextTx = GetNextTransactionInfo();
try
{
await this.connection.Commit(this.transactionInfo, nextTx).Await();
OnTransactionCommitted();
Reset();
this.transactionInfo = nextTx;
}
catch (NMSException)
{
Tracer.Info($"Commit failed for transaction :{oldTransactionId}");
throw;
}
catch (Exception e)
{
throw NMSExceptionSupport.Create(e);
}
finally
{
try
{
// If the provider failed to start a new transaction there will not be
// a current provider transaction id present, so we attempt to create
// one to recover our state.
if (nextTx.ProviderTxId == null)
{
await Begin().Await();
}
}
catch (Exception e)
{
// TODO
// At this point the transacted session is now unrecoverable, we should
// probably close it.
Tracer.Info($"Failed to start new Transaction after failed rollback of: {oldTransactionId} {e}");
}
}
}