•
•
Приложение не обязано следовать правилам ACID. Оно просто решает, фиксировать транзакцию или откатывать, а менеджер транзакций подготавливает все ресурсы для успешного осуществления этой операции.
Распределенные транзакции и XA
Как вы только что видели, операции с использованием одного ресурса (показанные на рис. 9.1) называют локальными транзакциями JTA. Однако многие корпоративные приложения используют несколько ресурсов. Возвращаясь к примеру перевода денежных средств, резервный и основной счета могут находиться в разных базах данных. В этом случае вам бы понадобилось управление транзакциями в нескольких ресурсах или же ресурсы должны были бы быть распределенными в вашей сети. Такие масштабные транзакции требуют специальных операций по координации при участии XA и службы транзакций Java (JTS).
На рис. 9.2 показано приложение, которое использует разграничение транзакций на нескольких ресурсах. Это означает, что в одной единице работы приложение может, например, сохранять данные в базу данных и отправить сообщение JMS.
Рис. 9.2. Транзакция XA, включающая в себя два ресурса
Для того чтобы транзакции надежно выполнялись для нескольких ресурсов, менеджеру транзакций требуется использовать интерфейс управления ресурсами XA (eXtendedArchitecture — расширенная архитектура). ХА — это стандарт, заданный группой Open Group (www.opengroup.org) для распределенной обработки транзакций (DTP) и обеспечивающий выполнение свойств ACID. Этот стандарт поддерживается JTA и позволяет гетерогенным менеджерам ресурсов разных производителей взаимодействовать через один интерфейс. XA использует механизм двухфазной фиксации (2pc), чтобы гарантировать, что все ресурсы либо зафиксированы, либо отменены для любой конкретной транзакции одновременно.
Для нашего примера перевода средств предположим, что деньги списываются с резервного счета из одной базы данных и транзакция завершается успешно. Далее на текущий счет, расположенный во второй базе, деньги зачисляются, но выполнить транзакцию не удается. Нам бы хотелось вернуться к первой базе данных и отменить зафиксированные изменения. Чтобы избежать этой проблемы несоответствия данных, двухфазная фиксация выполняет дополнительный подготовительный шаг перед окончательной фиксацией изменений, что показано на рис. 9.3. Во время фазы 1 каждый менеджер ресурсов получает уведомление с помощью команды «подготовки», которая говорит, что вот-вот будет произведена фиксация. Это позволяет менеджерам ресурсов объявить, могут ли они применить свои изменения. Если все они указывают, что готовы, транзакция разрешается и выполняется, а все менеджеры ресурсов должны выполнить фиксацию во второй фазе.
Рис. 9.3. Двухфазная фиксация
Большую часть времени ресурсы распределены по сети (рис. 9.4). Такая система использует службу JTS, которая реализует группу управления объектами (OMG) спецификации Object Transaction Service (OTS), что позволяет менеджеру транзакций участвовать в распределенных транзакциях с помощью протокола Internet Inter-ORB Protocol (IIOP).
По сравнению с рис. 9.2, где есть только один менеджер транзакций, на рис. 9.4 позволяется распространение распределенных транзакций с использованием IIOP. Текущая транзакция может быть распределена между различными компьютерами и различными базами данных от разных поставщиков. JTS предназначен для поставщиков, предоставляющих инфраструктуру систем транзакций. Как EJB-разработчику вам не придется беспокоиться об этом, просто используйте JTA, который взаимодействует с JTS на более высоком уровне.
Обзор спецификаций для работы с транзакциями
В Java EE 7, EJB и Managed Beans обрабатывают транзакции с помощью Java Transaction API (JTA), заданных в JSR 907. JTA определяет набор интерфейсов для приложений или контейнеров, предназначенных для транзакций с установленными границами. Кроме того, там определяется набор API, позволяющий работать с менеджером транзакций. Пакет javax.transaction задает эти интерфейсы.
Рис. 9.4. Распределенная транзакция XA
JTS — это спецификация, предназначенная для создания менеджера транзакций, который поддерживает интерфейсы JTA на высоком уровне и стандартное отображение в Java спецификации службы транзакций объектов CORBA 1.1 на низком уровне. JTS предоставляет возможность совместимости транзакций с использованием стандартного протокола CORBA IIOP для распространения транзакций между серверами. JTS предназначен для производителей, которые обеспечивают инфраструктуру системы транзакций для промышленного промежуточного ПО.