Ответ
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 произойдет автоматически при выходе из блока