Реализация распределенных транзакций Spring — с XA и без — часть 3

Java Spring

Другие предложения

в примереChainedTransactionManagerПреимущество в простоте: он не заморачивается с доступными расширениями и оптимизациями. Другой способ - использовать SpringTransactionSychronizationAPI регистрирует обратный вызов для текущей транзакции. Этоbest-jms-dbМетод в примере, где ключевой характеристикой являетсяTransactionAwareConnectionFactoryиDataSourceTransactionManagerКомбинация. Этот частный случай можно расширить, чтобы обобщить использованиеTransactionSynchronizationManagerна ресурсах, отличных от JMS. Преимущество заключается в том, что в принципе будут зачислены только те ресурсы, которые присоединяются к транзакции, а не все ресурсы в цепочке. Однако конфигурации по-прежнему необходимо знать, каким ресурсам соответствуют участники базовой транзакции.

Кроме того, команда инженеров Spring рассматривает возможность разработки функции «Best Efforts 1PC Transaction Manager» для Spring Core. Если вам нравится шаблон и вы хотели бы видеть его явную и более прозрачную поддержку в Spring, вы можете сделать это в этомJIRA-проблемаголосовать в.

нетранзакционный режим доступа

Шаблоны нетранзакционного доступа имеют смысл только в конкретном бизнес-процессе. Это означает, что иногда ресурсы, к которым вам нужен доступ, являются маргинальными и не должны быть в транзакции. Например, вы можете захотеть вставить строку в таблицу аудита, которая не имеет ничего общего с тем, была ли бизнес-транзакция успешной или нет, она просто записывает попытку что-то сделать. Чаще люди переоценивают, сколько изменений для чтения-записи им нужно внести в ресурс, и часто достаточно доступа только для чтения. Или операции записи можно контролировать с большей степенью детализации, чтобы при возникновении ошибок в операциях записи ошибки можно было учитывать или игнорировать.

В этих случаях ресурс, который не участвует в транзакции, может на самом деле иметь свою собственную транзакцию, но он не синхронизирован ни с одной из выполняемых транзакций. Если вы используете Spring, основная транзакция обрабатываетсяPlatformTransactionManagerУправляемые пограничные ресурсы могут быть получены из «источника данных» из «соединения» с базой данных, не контролируемого диспетчером транзакций. Все это происходит на каждом ресурсе границы доступа, и настройки по умолчаниюautoCommit = trueВремя.读操作不会看到在另一个未提交的事务中同时发生的更新(假设有合理的默认隔离级别),但是写操作的效果通常会被其他参与者立即看到。

Эта модель требует более тщательного анализа и проектирования бизнес-процессов большей уверенности, но она не совсем отличается от Best Efforts 1PC. Когда какие-то проблемы, компенсация универсального обслуживания имеет значение для большинства проектов, это нереально. Но простые случаи использования, связанные с идемпотентом, только для выполнения операции записи (возможно, многократного чтения) службы, не редкость. В идеале это нетранзакционный контекст.

Крылья полета: антипаттерн

Последний паттерн является анти-паттерном. Обычно это возникает, когда разработчики не понимают распределенных транзакций или не знают, что они реализовали распределенную транзакцию. Вы не можете просто предположить, что все ресурсы присоединяются к транзакции без явного вызова транзакционного API базового ресурса. Если вы используете кромеJtaTransactionManagerЗа пределами диспетчера транзакций Spring к этой схеме будет прикреплен ресурс транзакции. Этот менеджер транзакций будет использоваться для использования функций декларативного управления транзакциями Spring, таких как@Transactional) для перехвата выполнения метода. Нельзя ожидать, что другие ресурсы будут зачислены в ту же транзакцию. Обычный результат таков, что в нормальных условиях все нормально, но как только возникает исключение, пользователь обнаружит, что один из ресурсов не откатывается. Типичной ошибкой, вызывающей эту проблему, является использованиеDataSourceTransactionManagerи использование Hibernate для реализации репозитория.

Этот режим использует для чего?

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

Если вы еще не разобрались с распределенными транзакциями, возможно, у вас уже естькрылья полетамодель. Рано или поздно вы увидите данные, которые должны были быть отброшены, но этого не произошло. Вы можете не заметить влияние до тех пор, пока не произойдет фактическая ошибка, когда будет трудно отследить источник сбоя. Разработчики могут случайно использовать шаблон «Летающие крылья», потому что они думают, что XA уже работает, но на самом деле не настраивают базовые ресурсы для участия в транзакции. Раньше я работал над проектом, в котором база данных была установлена ​​другой группой, а поддержка XA была отключена во время установки. Система работает месяцами, а потом в бизнес-процессы начинают лезть странные баги. Диагностика этой проблемы заняла много времени.

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

Best Efforts 1PCИдеально подходит для систем, требующих низкой частоты отказов и не требующих накладных расходов на 2 ПК. Улучшение производительности при выборе этого режима является значительным. Его сложнее настроить, чем нетранзакционные ресурсы, но он не требует такого тщательного анализа и используется для более общих типов данных. Абсолютная согласованность данных требует, чтобы бизнес-обработка была идемпотентной по отношению к «внешним» ресурсам (любая фиксация, кроме первой). Прекрасным примером являются обновления базы данных, управляемые сообщениями, и Spring уже имеет для этого довольно хорошую поддержку. В менее распространенных случаях требуется дополнительный код фреймворка (который может оказаться частью Spring).

Поделиться ресурсомСхемы отлично подходят для особых случаев, обычно связанных с двумя конкретными типами и платформами ресурсов (например, ActiveMQ, размещенный совместно с любой СУБД, или Oracle AQ с базой данных Oracle). Преимуществом этого режима является исключительная надежность и отличная производительность.

Пример обновления кода

В связи с выходом новых версий Spring и других компонентов в этой статьеобразец коданеизбежно устареет. видетьВесенний сайт сообществадля доступа к последнему коду автора, а также к последним версиям Spring Framework и связанных компонентов.

Full XA with 2PCявляется универсальным и всегда имеет наивысшую надежность, самую надежную защиту от сбоев при использовании нескольких различных ресурсов. Недостатком этого режима является дороговизна, поскольку протокол диктует дополнительный ввод-вывод (но не записывайте его, пока не попробуете) и требует платформ специального назначения. Существуют реализации JTA этого шаблона с открытым исходным кодом, которые позволяют избавиться от серверов приложений, но многие разработчики по-прежнему считают этот подход неоптимальным. Конечно, гораздо больше людей предпочитают использовать JTA и XA, не тратя время на размышления о границах транзакций в своих системах. По крайней мере, если они используют Spring, их бизнес-логике не нужно знать, как обрабатываются транзакции, поэтому выбор платформы может быть отложен.

Dr. David SyerГлавный консультант SpringSource в Великобритании. Он является основателем и главным инженером проекта Spring Batch, платформы с открытым исходным кодом для создания и настройки автономных и пакетных приложений. Он часто проводит конференции по корпоративной Java и отраслевым комментаторам. Последние публикации можно найти на The Server Side, InfoQ и в блоге SpringSource.

больше ссылок

Если вы обнаружите ошибки в переводе или в других областях, требующих доработки, добро пожаловать наПрограмма перевода самородковВы также можете получить соответствующие бонусные баллы за доработку перевода и PR. начало статьиПостоянная ссылка на эту статьюЭто ссылка MarkDown этой статьи на GitHub.


Программа перевода самородковэто сообщество, которое переводит высококачественные технические статьи из Интернета сНаггетсДелитесь статьями на английском языке на . Охват контентаAndroid,iOS,внешний интерфейс,задняя часть,блокчейн,продукт,дизайн,искусственный интеллектЕсли вы хотите видеть более качественные переводы, пожалуйста, продолжайте обращать вниманиеПрограмма перевода самородков,официальный Вейбо,Знай колонку.