$transaction<T> method

Future<T> $transaction<T>(
  1. PrismaTransactionCallback<T, Client> callback, {
  2. TransactionHeaders? headers,
  3. Duration timeout = const Duration(seconds: 5),
  4. Duration maxWait = const Duration(seconds: 2),
  5. TransactionIsolationLevel? isolationLevel,
})

Interactive transactions.

Sometimes you need more control over what queries execute within a transaction. Interactive transactions are meant to provide you with an escape hatch.

Example

final prisma = PrismaClient();
prisma.$transaction((transaction) async {
  await transaction.user.create({ ... });
  await transaction.post.create({ ... });
});

Implementation

Future<T> $transaction<T>(
  PrismaTransactionCallback<T, Client> callback, {
  TransactionHeaders? headers,
  Duration timeout = const Duration(seconds: 5),
  Duration maxWait = const Duration(seconds: 2),
  TransactionIsolationLevel? isolationLevel,
}) async {
  // If the client is a transaction, use it.
  if (_transaction != null) {
    return callback(this as Client);
  }

  // Request a new transaction.
  final TransactionInfo transactionInfo = await _engine.startTransaction(
    headers: headers,
    timeout: timeout,
    maxWait: maxWait,
    isolationLevel: isolationLevel,
  );

  // Create a new client for the transaction.
  final Client client = copyWith(
    headers: QueryEngineRequestHeaders(
      transactionId: transactionInfo.id,
      traceparent: headers?.traceparent,
    ),
    transaction: transactionInfo,
  );

  // Execute the transaction.
  try {
    final T result = await callback(client);
    await _engine.commitTransaction(
      headers: headers,
      info: transactionInfo,
    );
    return result;
  } catch (e) {
    await _engine.rollbackTransaction(
      headers: headers,
      info: transactionInfo,
    );
    rethrow;
  }
}