startTransaction method

  1. @override
Future<TransactionInfo> startTransaction({
  1. TransactionHeaders? headers,
  2. Duration timeout = const Duration(seconds: 5),
  3. Duration maxWait = const Duration(seconds: 2),
  4. TransactionIsolationLevel? isolationLevel,
})
override

Starts a transaction.

Implementation

@override
Future<TransactionInfo> startTransaction({
  TransactionHeaders? headers,
  Duration timeout = const Duration(seconds: 5),
  Duration maxWait = const Duration(seconds: 2),
  TransactionIsolationLevel? isolationLevel,
}) async {
  await start();
  final url = resolveStartTransactionEndpoint();
  final body = convert.json.encode({
    'max_wait': maxWait.inMilliseconds,
    'timeout': timeout.inMilliseconds,
    'isolation_level': isolationLevel?.originalName,
  });
  final wrappedHeaders = headersWrapper(headers: [this.headers, headers]);

  // Create a retry function.
  Future<TransactionInfo> fn(void Function(Uri) logger) async {
    logger(url);

    final response =
        await http.post(url, headers: wrappedHeaders, body: body);
    final json =
        (convert.json.decode(convert.utf8.decode(response.bodyBytes)) as Map)
            .cast<String, dynamic>();
    _tryThrowPrismaException(json);
    _tryThrowExceptionFromStatusCode(response.statusCode);

    return TransactionInfo.fromJson(json);
  }

  return withRetry<TransactionInfo>(fn, gerund: 'starting transaction');
}