Вопрос проверяет понимание паттерна Unit of Work и его реализации через контекстный менеджер в Python для управления транзакциями.
Unit of Work — это паттерн, который собирает все изменения, сделанные с объектами в рамках одной бизнес-операции, и затем единовременно применяет их к базе данных. Это гарантирует атомарность: либо все изменения сохраняются, либо ни одно.
Контекстный менеджер (оператор with) идеально подходит для реализации Unit of Work, так как он автоматически управляет жизненным циклом транзакции. При входе в блок with открывается сессия/транзакция, а при выходе — либо фиксация (commit), либо откат (rollback) в случае исключения.
Пример с использованием SQLAlchemy:
from contextlib import contextmanager
from sqlalchemy.orm import Session
@contextmanager
def unit_of_work(session: Session):
try:
yield session
session.commit()
except Exception:
session.rollback()
raise
finally:
session.close()
# Использование
with unit_of_work(db_session) as session:
user = session.query(User).first()
user.name = 'New Name'
# При выходе из with изменения автоматически сохранятсяВывод: Используйте Unit of Work через context manager, когда нужно гарантировать атомарность операций с базой данных и упростить управление транзакциями, особенно в приложениях с несколькими изменениями за один запрос.