Spring Глобальная транзакция против локальной транзакции

При чтении через документацию транзакций Spring я вижу, что он поддерживает как глобальные транзакции, так и локальные транзакции.

  • Проще говоря, что такое глобальная транзакция и что такое локальная транзакция?
  • Каковы преимущества одного над другим? Каково их использование?

Если я использую следующую конфигурацию - значит ли это локальная транзакция?

<tx:annotation-driven transaction-manager="transManager" />

<bean id="transManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="emf" />
</bean>

Я пробовал искать как в Google, так и в Stackoverflow, но не получал никаких ресурсов, объясняющих то же самое простыми словами.

Ответ 1

На самом деле существует множество ресурсов, отвечающих на ваши первые два вопроса, например Spring Documentation объясняет, что такое локальная и глобальная транзакция, и отображает их различия в главе 9.2 Мотивация. В двух словах:

Глобальная транзакция - это управляемая сервером приложений транзакция, позволяющая работать с разными транзакционными ресурсами (это могут быть две разные базы данных, база данных и очередь сообщений и т.д.)

Локальная транзакция - это транзакция, зависящая от ресурса (например, Транзакции Oracle), и сервер приложений не имеет к ним никакого отношения. (та же глава объясняет все "за" и "против" каждого из них очень хорошо и намного лучше, чем я мог бы объяснить, поэтому я предлагаю вам взглянуть поближе)

Отвечая на ваш следующий вопрос. В документации говорится, что JpaTransactionManager способен обрабатывать глобальные транзакции, поэтому, глядя на фрагмент представленного кода, трудно сказать, является ли это локальной или глобальной транзакцией. В той же документации говорится, что вместо этого следует использовать локальную одноресурсную транзакцию DataSourceTransactionManager.