Программное управление транзакциями в Spring

Spring реализует прекрасную поддержку декларативного управления транзакциями. В сущности всё управление сводится к корректной расстановке аннотации @Transactional, а всё остальное берёт на себя . Но, в случае необходимости, можно взять контроль в свои руки и вернуть управление транзакциями в код.

Этот пример основан на статье Декларативное управление транзакциями в Spring и далее приведены только изменения в оригинальном коде.

Ручное управление транзакциями начинается с объекта TransactionTemplate, который конфигурируется PlatformTransactionManager:

TransactionTemplate использует парадигму callback (обратных вызовов) для исполнения кода внутри транзакции. В метод execute() передаётся код для исполнения, который будет синхронно исполнен в контексте транзакции.

В callback передаётся объект TransactionStatus, представляющий собой обёртку вокруг реальной транзакции. С его помощью можно управлять транзакцией, например программно откатывать её.

TransactionTemplate поддерживает все те же возможности, что и аннотация @Transactional, которые настраиваются вызовами соответствующих методов:

Код примера доступен на github