Download the PHP package sbooker/transaction-manager without Composer
On this page you can find all versions of the php package sbooker/transaction-manager. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.
Download sbooker/transaction-manager
More information about sbooker/transaction-manager
Files in sbooker/transaction-manager
Package transaction-manager
Short Description Abstraction for transaction control on an application tier.
License MIT
Informations about the package transaction-manager
Read in English
Менеджер Транзакций (sbooker/transaction-manager)
Реализация паттерна Unit of Work, которая навязывает безопасные и явные практики управления транзакциями и предоставляет мощный механизм хуков перед коммитом.
Философия и назначение
Библиотека спроектирована с учетом работы в долгоживущих процессах (воркерах, консьюмерах) и построена на трех ключевых принципах:
-
Явные границы транзакций. Библиотека намеренно не предоставляет публичные методы
begin()иcommit(). Единственный способ выполнить операцию — через замыканиеtransactional(). Такой подход делает границы транзакции абсолютно явными и защищает от трудноуловимых багов, когдаbegin()иcommit()разнесены по разным частям кода. -
Безопасная работа с сущностями. Библиотека предоставляет единственный метод для извлечения сущностей с целью их изменения —
getLocked(). Это также сделано намеренно, чтобы:- Заставить разработчика использовать блокировки (пессимистичные или оптимистичные, в зависимости от реализации
TransactionHandler), что предотвращает гонки данных по умолчанию. - Устранить необходимость в репозиториях внутри кода, который изменяет состояние системы. Ваш прикладной код зависит только от
TransactionManager, что делает его проще и чище.
- Заставить разработчика использовать блокировки (пессимистичные или оптимистичные, в зависимости от реализации
- Автоматическое управление состоянием. После каждой операции transactional() менеджер транзакций полностью очищает свое внутреннее состояние. Это предотвращает утечки памяти и гарантирует, что каждая транзакция начинается "с чистого листа", что критически важно для надежной работы воркеров.
Ключевые особенности
- Автоматическая очистка состояния: После каждого коммита или отката менеджер транзакций полностью очищает свое внутреннее состояние (Unit of Work) и состояние нижележащего обработчика. Это предотвращает утечки памяти и обеспечивает изоляцию операций в долгоживущих процессах.
- Явные границы транзакций: Метод
transactional()— единственный способ выполнить атомарную операцию. - Единый механизм загрузки с блокировкой: Метод
getLocked()— единственный способ получить сущность для изменения, что заставляет использовать блокировки и предотвращает проблемы параллельного доступа. - Паттерн Unit of Work: Управляет списком измененных и новых объектов и сохраняет их все в одной транзакции.
- Абстракция над ORM: Ваша бизнес-логика зависит только от
TransactionManager. - Поддержка вложенных транзакций: Безопасные вызовы
transactional()внутри другогоtransactional(). - Хук перед коммитом (
PreCommitEntityProcessor): Позволяет создавать мощные инструменты, такие как сохранение доменных событий.
Установка
Быстрый старт
Шаг 1: Подключите TransactionHandler
Для работы TransactionManager требуется "мост" к вашей ORM. Мы предоставляем готовые реализации:
- Для Doctrine ORM:
composer require sbooker/doctrine-transaction-handler - Для Yii2 Active Record:
composer require sbooker/yii2-ar-transaction-handler
Если вы используете другую ORM, вам нужно будет создать свой адаптер, реализующий интерфейс TransactionHandler.
Шаг 2: Соберите TransactionManager
Шаг 3: Используйте в прикладном коде
Пример создания сущности
Пример изменения сущности
Этот пример демонстрирует всю мощь подхода. Обратите внимание: здесь нет репозиториев.
Шаг 4 (Продвинутый): Добавление PreCommitProcessor
Зарегистрируйте ваш процессор в конструкторе TransactionManager, и он будет автоматически вызываться для всех сущностей (new Product из первого примера и $product из второго) перед коммитом.
Внимание!
License
See LICENSE file.