in Amazon.QLDB.Driver/session/AsyncQldbSession.cs [66:136]
internal async Task<T> Execute<T>(
Func<AsyncTransactionExecutor, Task<T>> func,
CancellationToken cancellationToken)
{
ValidationUtils.AssertNotNull(func, "func");
AsyncTransaction transaction = null;
string transactionId = QldbTransactionException.DefaultTransactionId;
try
{
transaction = await this.StartTransaction(cancellationToken);
transactionId = transaction.Id;
T returnedValue = await func(new AsyncTransactionExecutor(transaction, this.serializer));
if (returnedValue is IAsyncResult result)
{
returnedValue = (T)(object)(await AsyncBufferedResult.BufferResultAsync(result));
}
await transaction.Commit();
return returnedValue;
}
catch (TransactionAbortedException)
{
throw;
}
catch (InvalidSessionException ise)
{
if (IsTransactionExpiredException(ise))
{
throw new QldbTransactionException(
transactionId,
await this.TryAbort(transaction, cancellationToken),
ise);
}
else
{
throw new RetriableException(transactionId, false, ise);
}
}
catch (OccConflictException occ)
{
throw new RetriableException(transactionId, true, occ);
}
catch (AmazonServiceException ase)
{
if (ase.StatusCode == HttpStatusCode.InternalServerError ||
ase.StatusCode == HttpStatusCode.ServiceUnavailable)
{
throw new RetriableException(
transactionId,
await this.TryAbort(transaction, cancellationToken),
ase);
}
throw new QldbTransactionException(
transactionId,
await this.TryAbort(transaction, cancellationToken),
ase);
}
catch (Exception e)
{
throw new QldbTransactionException(
transactionId,
await this.TryAbort(transaction, cancellationToken),
e);
}
finally
{
transaction?.Dispose();
}
}