Не могли бы вы объяснить разницу между следующими двумя типами транзакций:
- Операция спящего режима
- Spring транзакция
Также я хотел бы узнать о аннотации @Transactional
.
Не могли бы вы объяснить разницу между следующими двумя типами транзакций:
Также я хотел бы узнать о аннотации @Transactional
.
Хорошо для стартеров они оба Транзакции, но они охватывают разные концепции и компоненты.
TL; DR
Hibernate обрабатывает транзакции, специфичные для базы данных, тогда как spring предоставляет общую службу управления транзакциями. @Transactional
- хороший способ настройки поведения управления транзакциями.
Длинная история:
Сделки
Транзакции - это, в основном, единицы работы (т.е. изменения чего-то), которые управляются как одна операция, которую можно либо зафиксировать, либо отменить. В мире Java существует множество различных типов транзакций: база данных, системы обмена сообщениями, такие как JMS, транзакции между приложениями (для тех, кто не слабый) или что-то еще, что может потребоваться включить в транзакцию. В стандартных транзакциях Java управляются с помощью API транзакций Java, который устанавливает правила участия в транзакции.
Hibernate
Hibernate - это ORM для абстрагирования компонентов базы данных с объектами Java, поэтому его транзакции конкретно связаны с изменениями, внесенными в базу данных. Транзакция может состоять из одной или многих записей в различные таблицы базы данных, которые все фиксируются после завершения операции. Откат транзакции, например f есть какие-либо ошибки во время операции, позволяет отменять все изменения.
Spring
На самом низком уровне Spring - это инфраструктура приложения для управления конфигурацией и зависимостями между объектами. Кроме того, он также предоставляет интерфейс для управления службами более высокого уровня, которые используются в современных приложениях, таких как базы данных, службы обмена сообщениями, фреймворки MVC и транзакции.
Spring предназначен для использования в качестве всеобъемлющего мастера объектов и сервисов в вашем приложении, поэтому его концепция транзакции находится на более высоком уровне, чем транзакции, специфичные для базы данных, которые сходятся с гибернацией. Spring Транзакции предназначены для точного контроля всех ваших транзакционных ресурсов при абстрагировании от часто ошибочной кодировки, необходимой для координации транзакций,
@Transactional
Spring предоставляет несколько различных методов для использования транзакций, среди которых существуют аспекты, основанные на xml, кодирование для API и аннотационных декларативных транзакций. Транзакции, основанные на аннотациях, удобны, потому что вам не нужно добавлять шаблон приложения для управления транзакциями в ваше приложение (даже с использованием PlatformTransactionManager через API имеет довольно много накладных расходов на кодирование).
Таким образом, в основном то, что происходит с @Transactional
, заключается в том, что во время выполнения spring сканирует вашу базу кода для классов и методов @Transactional и переносит их в код управления конкретной транзакцией на основе того, что вы настроили с помощью аннотации. Итак, такой метод:
@Transactional(propagation = REQUIRES_NEW, rollbackFor = {Exception.class})
public void saveAndSendMessage(Foo foo) throws Exception {
dbManager.save(foo);
Bar bar = transform(foo);
jmsSystem.send(bar);
}
может иметь spring создать новую транзакцию для системы базы данных и jms и скоординировать их без необходимости автоматического добавления всего кода управления tx.