$transaction<T> method
Future<T>
$transaction<T>(
- PrismaTransactionCallback<
T> callback, { - TransactionOptions options = const TransactionOptions(),
- TransactionHeaders headers = const TransactionHeaders(),
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> callback, {
TransactionOptions options = const TransactionOptions(),
TransactionHeaders headers = const TransactionHeaders(),
}) async {
// If the client is a transaction, use it.
if ($headers?.transactionId != null) {
return callback(this);
}
// Request a new transaction.
final TransactionInfo transactionInfo = await $engine.startTransaction(
options: options,
headers: headers,
);
// Create a new client for the transaction.
final PrismaClient transactionClient = PrismaClient.fromEngine(
$engine,
headers: QueryEngineRequestHeaders(
transactionId: transactionInfo.id,
traceparent: headers.traceparent,
),
);
// Execute the transaction.
try {
final T result = await callback(transactionClient);
await $engine.commitTransaction(
headers: headers,
info: transactionInfo,
);
return result;
} catch (e) {
await $engine.rollbackTransaction(
headers: headers,
info: transactionInfo,
);
rethrow;
}
}