Когда использовать глобальную транзакцию или использовать Spring AOP для транзакции

Q1. я понимаю, когда нам нужно иметь дело с несколькими базами данных, нам нужно использовать глобальные транзакции. но из этого поста http://fogbugz.atomikos.com/default.asp. человек предложил просто использовать Spring AOP, чтобы проконсультировать по поводу другого менеджера транзакций (подробнее> источник данных / сессия сеанса). Может кто-нибудь объяснить, в какой ситуации мы можем просто использовать этот подход И в какой ситуации нам нужен XA (глобальная транзакция) с atomikos или jotm или ejb..etc

2 ответа

Решение

Если вы ссылаетесь на это сообщение http://fogbugz.atomikos.com/default.asp?community.6.596.2, то важная часть вопроса от OP:

Задача может быть набором команд sql для datasource1 или datasource2.

Другими словами, OP не будет задействовать несколько транзакционных ресурсов, он будет использовать один или другой (и явно пишет, что ему действительно не нужна поддержка XA). Поэтому он не нуждается в поддержке глобальных транзакций, он может использовать только локальные транзакции, и использование менеджера транзакций J2EE не является обязательным для его случая использования.

И это то, что предлагает ответ: использование Atomikos не является необходимым и может быть излишним.

Используя два dataSource, два txManager, два txAdvice и определяя отличительные <aop:advisor/> элементы с отличающимися 'pointcut' а также 'advice-ref' значения атрибутов позволят применять совершенно разные транзакционные конфигурации к различным объектам / методам уровня обслуживания.

Смотрите раздел 9.5.4. Настройка различных семантик транзакций для разных компонентов для деталей.

Но если вам нужно работать с несколькими транзакционными ресурсами (обычно реляционными базами данных и очередями сообщений), то вам нужна глобальная поддержка транзакций, которая означает менеджер транзакций J2EE (предоставляемый сервером приложений J2EE или автономный, например, Atomikos, JBossTS, JOTM и т. Д.).

Я думаю, что Паскаль полностью ответил на ваш вопрос, но я хочу попытаться упростить / обобщить его.

  • Если вам нужно выполнить параллельные, независимые задачи с источниками данных без требования к области транзакции (например, если транзакция завершается неудачей в одном источнике данных, нет необходимости выполнять откат в других), используйте предложение Паскаля или подход в http://fogbugz.atomikos.com/default.asp?community.6.596.2 (например, не JTA / не XA / не распространяется)

  • Если вам нужна область транзакции между различными источниками данных, например, если откат в одном источнике данных должен откатить изменения в другом источнике данных в рамках одной логической области транзакции (например, база данных банка и база данных кредитных карт, выполняющая перевод средств, вы не можете получить декрет / инкриз в одном без соответствующего инрезе / декрете в другом) вам нужен менеджер транзакций JTA (XA / распределенный)

Надеюсь, что это делает картину более четкой (я открыт для комментариев, если я слишком упрощен или просто ошибаюсь)

Другие вопросы по тегам