transaction<T> method

  1. @override
Future<T> transaction<T>(
  1. Future<T> action(
    1. SqlExecutor transaction
    )
)
override

Runs action inside one database transaction.

The transaction commits when action completes and rolls back when it throws. Drivers invalidate the callback executor after action returns. Callback SqlExecutor.query calls require SqlStatementKind.rowReturning, while SqlExecutor.execute calls require SqlStatementKind.write.

The callback must not issue transaction-control SQL or statements whose dialect implicitly commits, such as MySQL DDL.

Implementation

@override
Future<T> transaction<T>(Future<T> Function(SqlExecutor transaction) action) {
  if (_insideTransaction) {
    return Future<T>.error(
      const SqlException(
        SqlErrorCode.unsupported,
        'Nested PostgreSQL transactions are not supported.',
      ),
    );
  }
  return _schedule(() => _transaction(action));
}