3.4.5.2. Декларативное управление транзакциями
Любой метод Spring-бина Middleware можно пометить аннотацией @org.springframework.transaction.annotation.Transactional
, что вызовет автоматическое создание транзакции при вызове этого метода. В таком методе не нужно вызывать Persistence.createTransaction()
, а можно сразу получать EntityManager
и работать с ним.
Для аннотации @Transactional
можно указать параметры, в том числе:
-
propagation
- режим создания транзакции. ЗначениеREQUIRED
соответствуетgetTransaction()
, значениеREQUIRES_NEW
-createTransaction()
. По умолчаниюREQUIRED
.@Transactional(propagation = Propagation.REQUIRES_NEW) public void doSomething() { }
-
value
- имя хранилища данных. Если опущено, подразумевается основная БД. Например:@Transactional("db1") public void doSomething() { }
Декларативное управление транзакциями позволяет уменьшить количество boilerplate кода, однако имеет следующий недостаток: коммит транзакции происходит вне прикладного кода, что часто затрудняет отладку, т.к. скрывается момент отправки изменений в БД и перехода сущностей в состояние Detached. Кроме того, следует иметь в виду, что декларативная разметка сработает только в случае вызова метода контейнером, т.е. вызов транзакционного метода из другого метода того же самого объекта не приведет к старту транзакции.
В связи с этим рекомендуется применять декларативное управление транзакциями только для простых случаев, таких как методы сервисов, читающих некоторый объект и возвращающих его клиенту.