На заре вычислительной техники не было необходимости в распределенных транзакциях. По мере увеличения количества приложений синхронизация данных становится важной проблемой. Компании много платили за поддержку синхронизированных систем с точки зрения потока данных. В результате возник двухфазный протокол фиксации, называемый XA (расширенная архитектура). Этот протокол предоставляет ACID-подобные свойства для глобальной обработки транзакций. В этой статье я попытаюсь объяснить детали транзакций XA и использование транзакций XA в среде Spring.

Протокол двухфазной фиксации — это атомарный протокол фиксации для распределенных систем. Этот протокол, как следует из его названия, состоит из двух фаз. Первый этап — это фаза запроса на фиксацию, на которой менеджер транзакций координирует все ресурсы транзакции для фиксации или отмены. На этапе фиксации менеджер транзакций решает завершить операцию, зафиксировав или прервав ее в соответствии с голосами каждого ресурса транзакции. Далее мы перейдем к деталям реализации протокола 2PC.

См. здесь ресурсы по взаимодействию Java + .NET через 2PC.

Транзакциям XA требуется глобальный идентификатор транзакции и идентификатор локальной транзакции (xid) для каждого ресурса XA. Каждый ресурс XA зачисляется в диспетчер XA с помощью метода start(xid). Этот метод сообщает, что ресурс XA участвует в транзакции (будьте готовы к операциям). После этого реализуется первая фаза протокола 2PC путем вызова метода prepare(xid). Этот метод запрашивает голос OK или ABORT от ресурса XA. После получения голоса от каждого ресурса XA менеджер XA решает выполнить операцию фиксации (xid), если все ресурсы XA отправляют OK, или решает выполнить откат (xid), если ресурс XA отправляет ABORT. Наконец, метод end(xid) вызывается для каждого ресурса XA, сообщая, что транзакция завершена. Посмотрите на рисунок, чтобы лучше понять. По мере того, как мы создаем предысторию реализации транзакции XA, мы пойдем глубже и увидим тип этой команды, эту команду, эту команду, ошибки и возможные решения.


Сбои могут произойти в любое время из-за потери сети, сбоя компьютера и какой-либо ошибки администратора. В транзакции XA мы будем классифицировать эти сбои в соответствии с фазами, в которых они происходят. Первая фаза сбоя — перед запуском протокола. Это простой сбой, который системе не нужно откатывать или выполнять какие-либо операции. Мы просто не делаем операцию для этого конкретного момента. Второй тип этой команды эта команда эта команда сбоя может произойти на этапе подготовки (фиксация-запрос), который может быть легко обработан откатами с использованием политик тайм-аута. И последнее, но не менее важное — это сбои фазы фиксации, которые могут возникнуть из-за неполных откатов и любых проблем в цепочке. Во всех вышеперечисленных ситуациях диспетчер транзакций пытается устранить проблему. Далее мы увидим, как диспетчер транзакций пытается преодолевать сбои.

При восстановлении диспетчер транзакций вызывает метод восстановления каждого ресурса XA. Ресурсы XA отслеживают журналы и пытаются восстановить их последнее состояние. Диспетчер транзакций вызывает необходимые операции отката, и миссия выполнена. Этот процесс может показаться удачным, но есть много исключительных ситуаций, когда журналы могут быть проблематичными, например, быть поврежденными. В таких ситуациях менеджер транзакций использует некоторые эвристики для решения проблемы. Кроме того, процесс восстановления зависит от журналов упреждающей записи, в которые вы записываете журналы операций перед применением. Что касается проблем с производительностью, эти журналы записываются в собственном формате (без использования какой-либо сериализации), и система должна лучше их группировать, если это возможно. Далее мы переходим к забавной части, которая представляет собой поддержку транзакций XA фреймворком Spring.

Spring Framework предоставляет обширную среду для разработки веб-приложений и автономных приложений. Как и другие предоставляемые им утилиты, транзакции XA также поддерживаются Spring. Однако эта поддержка не является собственной реализацией и требует спящего режима, веб-контейнера или платформы, обеспечивающей управление транзакциями XA. Spring имеет JtaTransactionManager, который предоставляет утилиты управления транзакциями и скрывает детали. Таким образом, мы можем управлять транзакциями для нескольких источников данных, которые обновляются одновременно. Когда дело доходит до управления транзакциями XA, поддержка гибернации и веб-контейнеров для транзакций XA хорошо документирована и не нуждается в упоминании. Однако работа с инфраструктурой, обеспечивающей транзакции XA, может привести к путанице. Таким образом, я продолжу этот пост, представив Bitronix Transaction Manager.

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

Теперь у нас может быть несколько источников данных, которые можно настроить следующим образом. Каждый источник данных должен иметь свойство uniqueName, которое является уникальным. Ниже приведена конфигурация для Oracle, другие базы данных могут иметь другие конфигурации. О любых других деталях вы можете узнать на сайте Bitronix.

Подводя итог, мы попытались объяснить, что такое транзакции XA, базовые протоколы и интеграция управления транзакциями Bitronix со Spring в отдельном приложении. Для расширения XA Transactions обеспечивает одновременное изменение различных источников данных. Кроме того, транзакции XA поддерживаются веб-контейнерами или фреймворками, подобными спящему режиму. Тем не менее, нам может понадобиться интегрировать управление транзакциями в отдельное приложение, в котором мы должны настроить менеджер транзакций. Как следствие, транзакция XA обеспечивает согласованные операции с несколькими источниками данных, и компании их используют.
Мы надеемся, что эта статья помогла вам выполнить транзакции XA (двухэтапная фиксация): простое руководство. Если у вас есть другие вопросы, мы будем рады ответить на ваши; пожалуйста, свяжитесь с нами в разделе ниже. Не забудьте поделиться signalfix.net с семьей и друзьями!