В чем заключается паттерн Unit of Work

Ответ

Unit of Work — это поведенческий паттерн проектирования, который отслеживает изменения бизнес-объектов и координирует их запись в базу данных в рамках одной транзакции. Его главная цель — обеспечить атомарность и согласованность данных при выполнении группы операций.

Паттерн решает проблему выполнения нескольких действий (вставка, обновление, удаление) как единого целого. Все изменения накапливаются и применяются к базе данных одним вызовом (commit), либо полностью отменяются (rollback) в случае ошибки.

Ключевые задачи:

  • Отслеживание состояния: Регистрирует новые, измененные и удаленные объекты.
  • Группировка операций: Объединяет все изменения в одну транзакцию.
  • Атомарность: Гарантирует, что либо все изменения будут сохранены, либо ни одно из них.

Многие ORM, например SQLAlchemy, реализуют этот паттерн через объект сессии (Session). Вот пример явной реализации с использованием контекстного менеджера в Python:

# Пример реализации паттерна Unit of Work
class UnitOfWork:
    def __init__(self, session_factory):
        self.session_factory = session_factory

    def __enter__(self):
        # В начале блока with создается новая сессия
        self.session = self.session_factory()
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        # При выходе из блока with
        if exc_type:
            # Если произошло исключение, откатываем транзакцию
            self.session.rollback()
        else:
            # Иначе — успешно коммитим
            self.session.commit()
        self.session.close()

# Использование в сервисном слое
# Session - это сконфигурированная фабрика сессий SQLAlchemy
with UnitOfWork(Session) as uow:
    user = User(name='Alice')
    uow.session.add(user)
    # commit или rollback произойдет автоматически при выходе из блока