$transaction<T> method
Future<T>
$transaction<T>(
- PrismaTransactionCallback<
T, Client> callback, { - TransactionHeaders? headers,
- Duration timeout = const Duration(seconds: 5),
- Duration maxWait = const Duration(seconds: 2),
- 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;
}
}