withTransaction<R> function

Future<R> withTransaction<R>({
  1. required Future<R> action(),
  2. TransactionNesting nesting = TransactionNesting.nested,
  3. bool useTransaction = true,
  4. DbPool? dbPool,
  5. String? debugName,
})

Obtains a connection and starts a MySQL transaction.

(docstring unchanged for brevity)

Implementation

Future<R> withTransaction<R>({
  required Future<R> Function() action,
  TransactionNesting nesting = TransactionNesting.nested,
  bool useTransaction = true,
  DbPool? dbPool,
  String? debugName,
}) {
  final nestedTransaction = Scope.hasScopeKey(Transaction.transactionKey);

  switch (nesting) {
    case TransactionNesting.notAllowed:
      if (nestedTransaction) {
        throw NestedTransactionException('You are already in a transaction. '
            'Specify TransactionNesting.nestedTransaction');
      }
      return _runTransaction(
        action,
        useTransaction: useTransaction,
        shareDb: false,
        debugName: debugName,
      );

    case TransactionNesting.detached:
      return _runTransaction(
        action,
        useTransaction: useTransaction,
        shareDb: false,
        debugName: debugName,
      );

    case TransactionNesting.nested:
      return _runTransaction(
        action,
        useTransaction: useTransaction && !nestedTransaction,
        shareDb: nestedTransaction,
        debugName: debugName,
      );
  }
}