Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+2 326новых вакансий за сутки·88 980вакансий открыто сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании7 175
РезюмеAIПодготовкаСтатьи
BoostТарифыBoost
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 400 кандидатов открыты к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python16 036
  • Облачные технологии12 746
  • QA вакансии3 431
  • Backend вакансии1 983
  • Инженер данных1 590
  • Продакт-менеджер1 097

Разработка

  • Android1 792
  • iOS1 660
  • AI вакансии924
  • Fullstack вакансии835
  • Frontend вакансии702
  • Mobile вакансии36

По стеку

  • Go8 538
  • Java5 808
  • Node.js1 826
  • Kotlin1 514
  • .NET1 433
  • Rust1 416
  • PHP591
  • C#500
  • C++449

DevOps и инфраструктура

  • Kubernetes7 088
  • DevOps вакансии5 341
  • Linux-инфраструктура5 148
  • Terraform / IaC3 908
  • CI/CD2 192
  • Мониторинг и Observability1 724
  • SRE539
  • Кибербезопасность367

Аналитика и данные

  • Data Scientist977
  • Бизнес-аналитик828
  • Аналитик данных809
  • Системный аналитик111

Другие направления

  • Проджект-менеджер486
  • UI/UX дизайн119
  • Ручное тестирование14

По регионам

  • Вакансии в США44 024
  • Вакансии в Европе19 966
  • Вакансии в Канаде4 349
  • Работа в России3 875

По формату

  • Удалённые вакансии72 075
  • Релокация в США44 024
  • Гибридная работа10 789
  • Офисная работа6 889

По уровню

  • Senior вакансии39 966
  • Middle вакансии19 556
  • Junior вакансии6 496

Сейчас нанимают

Все компании
  • Wise194 вакансии
  • Rakuten189 вакансий
  • ASML164 вакансии
  • Grab136 вакансий
  • Celonis45 вакансий
  • Spotify37 вакансий
  • Adyen29 вакансий
  • Infobip28 вакансий
  • Monzo19 вакансий
  • Darktrace17 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме FastAPIВсе вопросы
FastAPISeniorПроектирование систем

Как управлять транзакциями базы данных и откатами в FastAPI с SQLAlchemy?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

Транзакции в FastAPI+SQLAlchemy управляются через dependency с yield: при успехе — commit, при исключении — rollback. Для частичных откатов используйте begin_nested() (SAVEPOINT).

Базовая модель: сессия через Dependency Injection

SQLAlchemy AsyncSession оборачивается в FastAPI dependency с yield. Транзакция начинается автоматически при первом запросе к БД и фиксируется (или откатывается) в блоке finally.

from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine, async_sessionmaker
from fastapi import Depends

engine = create_async_engine(
    "postgresql+asyncpg://user:pass@localhost/db",
    pool_size=10,
    max_overflow=20,
)
AsyncSessionLocal = async_sessionmaker(engine, expire_on_commit=False)

async def get_db() -> AsyncSession:
    async with AsyncSessionLocal() as session:
        try:
            yield session
            await session.commit()
        except Exception:
            await session.rollback()
            raise

Использование в endpoint

from fastapi import FastAPI, Depends, HTTPException
from sqlalchemy import select

app = FastAPI()

@app.post("/transfer")
async def transfer(
    from_id: int,
    to_id: int,
    amount: float,
    db: AsyncSession = Depends(get_db),
):
    from_acc = await db.get(Account, from_id)
    to_acc = await db.get(Account, to_id)

    if from_acc.balance < amount:
        raise HTTPException(400, "Insufficient funds")  # автоматический rollback

    from_acc.balance -= amount
    to_acc.balance += amount
    # commit выполнится в dependency при успешном выходе из yield
    return {"status": "ok"}

Savepoints и вложенные транзакции

SQLAlchemy поддерживает begin_nested() для создания SAVEPOINT. Позволяет откатить часть операций без потери всей транзакции:

async def create_order_with_fallback(db: AsyncSession, order_data: dict):
    async with db.begin_nested() as nested:
        try:
            order = Order(**order_data)
            db.add(order)
            await db.flush()  # проверяем constraints без commit
            await send_notification(order.id)  # может упасть
        except Exception:
            await nested.rollback()  # откат только вложенной части
            order = Order(**order_data, notify=False)
            db.add(order)
            await db.flush()
    # внешняя транзакция продолжает работу

Явный контроль транзакций

@app.post("/batch")
async def batch_insert(items: list[ItemCreate], db: AsyncSession = Depends(get_db)):
    async with db.begin():  # явная транзакция
        for item in items:
            db.add(Item(**item.model_dump()))
    # commit вызывается автоматически при выходе из context manager
    return {"inserted": len(items)}

Isolation level

Для критичных операций (например, вычитание остатка) устанавливайте уровень изоляции на уровне соединения или движка:

engine = create_async_engine(
    DATABASE_URL,
    execution_options={"isolation_level": "REPEATABLE READ"},
)

# или для конкретного запроса:
async with engine.begin() as conn:
    await conn.execution_options(isolation_level="SERIALIZABLE")
    result = await conn.execute(select(Account).where(...))

Подводные камни

  • expire_on_commit=True (дефолт) — после commit все атрибуты объектов инвалидируются; при обращении к ним вне сессии возникает DetachedInstanceError. Используйте expire_on_commit=False в async-контексте.
  • Долгие транзакции — держать транзакцию открытой во время HTTP-вызова к внешнему сервису блокирует строки и истощает пул соединений.
  • await session.flush() vs commit() — flush() отправляет SQL в БД но не фиксирует; данные видны только в текущей транзакции. Забытый flush перед чтением auto-increment ID — частая ошибка.
  • rollback при HTTPException — HTTPException — это обычный raise; dependency с except Exception: rollback корректно откатывает транзакцию, но только если exception не перехвачен раньше.
  • Несколько сессий в одном запросе — если два Depends используют разные сессии, они видят разные состояния БД; объединяйте их в одну сессию через общий Depends.
  • Savepoint не работает без begin() — begin_nested() требует активной внешней транзакции; в autocommit-режиме вызов упадёт.
  • SELECT FOR UPDATE в async — используйте with_for_update() в SQLAlchemy, а не сырой SQL, чтобы избежать дедлоков при конкурентных обновлениях.

Частые вопросы на собеседовании

  • Как FastAPI использует Pydantic-модели для валидации запросов и ответов?
  • Как интегрировать SQLAlchemy с FastAPI для работы с базой данных?
  • Как реализовать аутентификацию через OAuth2 и JWT-токены в FastAPI?
  • Что такое ASGI и чем FastAPI/Uvicorn отличается от WSGI-серверов?

Типичные ошибки

  • Описывать database transactions только как термин и не показывать механизм на минимальном примере.
  • Игнорировать ошибки, пустые данные, конкурентный доступ или границы транзакции.
  • Не связывать поведение с официальным контрактом FastAPI и реальной эксплуатацией.

Что проверяет интервьюер

  • Объясняет database transactions через последовательность действий, а не через набор ключевых слов.
  • Приводит короткий кодовый пример или production-сценарий с ожидаемым поведением.
  • Называет хотя бы один риск: производительность, безопасность, транзакции, память или сопровождение.
  • Умеет обсудить отказ, наблюдаемость и rollback без изменения публичного контракта.

Как вы знаете этот вопрос?

Проверить себя по теме FastAPI →

Источники

  • https://fastapi.tiangolo.com/tutorial/sql-databases/

Связанные темы

FastAPIapi-designdatabase-designproduction-architecturetechnical-reasoning

Вакансии с этим навыком

  • Backend Software Engineer
  • Python Engineer
  • Senior Python Engineer
  • Senior FastAPI Engineer
  • AI Engineer / Fullstack-разработчик AI-решений