- Оригинальный адрес:Distributed transactions in Spring, with and without XA - Part III
- Оригинальный автор:David Syer
- Перевод с:Программа перевода самородков
- Постоянная ссылка на эту статью:GitHub.com/rare earth/gold-no…
- Переводчик:radialine
- Корректор:kezhenxu94
Другие предложения
в примереChainedTransactionManager
Преимущество в простоте: он не заморачивается с доступными расширениями и оптимизациями. Другой способ - использовать SpringTransactionSychronization
API регистрирует обратный вызов для текущей транзакции. Это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.
больше ссылок
- скачать эту статьюисходный код. Также не забудьте посетитьВесенний сайт сообществаПолучите последний код для этой статьи.
- Узнайте больше о документации по Java
javax.transaction
изJTAиXAResource
знание. - "Весна с ХА(Мурали Косараджу, JavaWorld, апрель 2007 г.) объясняет, как настроить Spring с помощью JTA вне контейнера Java EE.
- "Погружение в XA, часть 2"(Майк Спилле, Pyrasun, The Spille Blog, апрель 2004 г.) - очень хорошая статья, помогающая понять всю глубину 2PC.
- читатьSpringсправочник,Глава IX Управление транзакциями, чтобы получить более глубокое представление о том, как работает управление транзакциями Spring и как настроить управление транзакциями Spring.
- "Управление транзакциями в J2EE 1.2(Sanjay Mahapatra, Javaworld, июль 2000 г.) Определяет кислотные свойства транзакций, включая атомность.
- существует"Использовать XA или не использовать XA(Блог Гая, октябрь 2006 г.), Гай Пардон, технический директор Atomikos, поддерживает использование XA.
- читатьAtomikos documentationПриходите узнать об этом менеджере транзакций с открытым исходным кодом.
- "Как создать ссылку на базу данных в Oracle"(Элиза Габберт, SearchOracle.com, январь 2004 г.) объясняет, как создать ссылку на базу данных Oracle.
- Взвесьте это для фреймворка SpringПредоставляет готовый менеджер транзакций на 1 ПК с максимальной эффективностью.предложение.
Если вы обнаружите ошибки в переводе или в других областях, требующих доработки, добро пожаловать наПрограмма перевода самородковВы также можете получить соответствующие бонусные баллы за доработку перевода и PR. начало статьиПостоянная ссылка на эту статьюЭто ссылка MarkDown этой статьи на GitHub.
Программа перевода самородковэто сообщество, которое переводит высококачественные технические статьи из Интернета сНаггетсДелитесь статьями на английском языке на . Охват контентаAndroid,iOS,внешний интерфейс,задняя часть,блокчейн,продукт,дизайн,искусственный интеллектЕсли вы хотите видеть более качественные переводы, пожалуйста, продолжайте обращать вниманиеПрограмма перевода самородков,официальный Вейбо,Знай колонку.