Одним из ключевых моментов, о @Transactional
том, что есть два отдельных понятия, чтобы рассмотреть, каждый с его собственной области и жизненный цикл:
- живучесть транзакции контекст
- база данных
Само по себе транзакционная аннотация определяет область действия одной транзакции базы данных. Транзакция базы данных происходит внутри области контекста персистентности. Код:
@Transactional
def save(SomeDomain someDomain) {
someDomain.someProperty = firstService.createAndSaveSomething(params) //transactional
someDomain.anotherProperty = secondService.createAndSaveSomething(params) //transactional
someDomain.save(flush: true)
}
Контекст настойчивость в JPA EntityManager, реализуемый внутри, используя Hibernate Session (при использовании Hibernate в качестве поставщика сохраняемости). Код:
def save(SomeDomain someDomain) {
combinedService.createAndSave(someDomain, params) //transactional, encapsulating first and second service calls
}
Примечание: Контекст живучести просто объект синхронизатора, который отслеживает состояние ограниченного набора объектов Java и убеждается, что изменения на тех объектах, которые в конечном счете сохраняется обратно в базу данных.
Вывод: Механизм управления декларативными транзакциями (@Transactional
) является очень мощным, но его можно неправильно использовать или неправильно настроить.
Понимание того, как это работает внутри, полезно при устранении неполадок, когда механизм совсем не работает или работает неожиданным образом.
Можете ли вы показать нам аннотации @Transaction двух сервисов? – saw303
Предполагая, что все мои службы имеют аннотацию @Transactional на уровне класса. – renz
https://github.com/vahidhedayati/test-transactions – Vahid