В чем разница между транзакцией Spring и транзакцией "Hibernate",

Не могли бы вы объяснить разницу между следующими двумя типами транзакций:

  • Операция спящего режима
  • Spring транзакция

Также я хотел бы узнать о аннотации @Transactional.

Ответ 1

Хорошо для стартеров они оба Транзакции, но они охватывают разные концепции и компоненты.

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.