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.