XA
XA (от англ. extended architecture[1], X/Open XA) — спецификация распределённых транзакций, определяющая принципы совместного участия транзакционных ресурсов в транзакции в условиях распределённых вычислений. Впервые описана в 1992 году, является фактическим стандартом реализации в менеджерах распределенных транзакций и реляционных базах данных.
XA-транзакция — распределённая транзакция, выполняемая под управлением системы, удовлетворяющей спецификации XA.
История
К началу 1990-х годов существовало несколько различных стандартов распределённых транзакций, например, TPF, используемый и в гражданской авиации США и в 2010-е годы[2], CISC, VMS и другие. Один из них, SNA от IBM стал к тому времени стандартом de facto. Под влиянием этого стандарта и стандарта LU6.2 ISO создала несколько новых стандартов[3]:
- Remote Operations Services (ROSE), определяющий как клиент вызывает сервер
- Commit, Concurrency Control, and Recovery (OSI-CCR), определяющий сообщение фиксации (commit) в пределах одной сессии
- Transaction Processing (OSI-TP), определяющий, как следует создавать идентификаторы транзакций и как ими управлять
Основным недостатком этих стандартов было отсутствие API, таким образом, они сообщали как менеджеры транзакций должны взаимодействовать, но не предоставляли правил написания переносимых приложений.
X/Open решил эту проблему, предоставив модель распределённых транзакций, и, одновременно с этим, специфицировав процедурный интерфейс взаимодействия участников транзакции (CLI), спецификацию XA.
Модель
В XA используется модель распределенных транзакций, состоящая из трёх компонент:
- Прикладная программа (AP) — программа, определяющая, из каких частей должна состоять транзакция, какие менеджеры ресурсов (RM) использовать и так далее. По сути именно здесь описывается бизнес-логика.
- Менеджер распределенных транзакций (TM) — он же координатор, координирует работу RM и принимает решение о закреплении или откате транзакции, используя двухфазный протокол фиксации транзакции (англ. Two-phase commit protocol).
- RM, такие как СУБД, используются для хранения информации.
Несмотря на то, что в модели фигурируют три компонента, спецификация XA определяет только взаимодействие между менеджерами ресурсов и транзакций.
Спецификация XA разделяет транзакции на локальные и глобальные. Локальные транзакции — самый простой вид транзакций, в них прикладная программа обращается только к одной СУБД и сама определяет, когда закреплять или откатывать транзакцию. То есть в них роль TM отводится AP. Глобальные (распределённые) транзакции — более сложный случай, в нём решение о фиксации изменений или откате ложится на плечи координатора, прикладная программа определяет только границы транзакций. Менеджер транзакций делит одну глобальную транзакцию на несколько выполняющихся локально веток (англ. branch), и при успешной фиксакции на каждой из веток осуществляет фиксацию всей глобальной транзакции, и осуществляет откат в противном случае.
Кроме того, спецификация поддерживает вложенные транзакции (nested transactions), которые полезны, например, для журналирования.
XA+
В спецификации XA+, выпущенной в 1994 году, определяются также транзакции, распределенные относительно приложений. В XA+ появляется ещё один участник транзакции — менеджер по ресурсному взаимодействию (Communication Resource Manager, CRM), который отвечает за координацию между несколькими менеджерами распределённых транзакций, в этой модели он отвечает за новые ветви транзакции, которые, в свою очередь, содержат ещё несколько ветвей, а также за генерацию идентификаторов транзакций.
Стандарты, основанные на XA
Несмотря на то, что XA специфицирует API лишь для языка Си, существуют реализации и на других языках программирования.
Java Transaction API — реализация XA для платформы J2EE, впервые выпущенная в 1999 году. В .Net Framework поддержка распределённых транзакций появилась лишь в версии 2.0, кроме XA, реализация распределённых транзакций .NET поддерживает OLE[4].
XA и OTS
В спецификации Object Transaction Service от Object Management Group 1991 года вносится транзакционность в CORBA. Благодаря тому, что спецификация не разделяет участников транзакции на RM и TM, только на клиент и сервер, имеется возможно использовать XA и OTS в одном клиент-серверном приложении. Кроме того, если один из RM не поддерживает XA, но поддерживает OTS, то эта связка является единственно возможным решением проблемы распределённых транзакций в таком окружении.
Связка XA и OTS используется в Java EE, где обёрткой над OTS является Java Transaction Service, а Java Transaction API в свою очередь отделяет JTS от AP.
Примечания
- Oracle FAQ: What does XA stand for
- См Transaction Processing: Concepts and Techniques, раздел 1.5
- См Transaction Processing: Concepts and Techniques, раздел 2.7.4
- INFO: Connections May Not Participate in MTS/COM+ Transactions When You Use OLE DB Directly
Ссылки
- https://www2.opengroup.org/ogsys/jsp/publications/PublicationDetails.jsp?publicationid=11415 - DTP model
- https://web.archive.org/web/20140123073914/http://docs.oracle.com/cd/E13085_01/doc/timesten.1121/e13068/jta.htm - взят отсюда с небольшими изменениями
- https://web.archive.org/web/20100709211701/http://www.webservices.org/weblog/mark_little/web_services_transactions_and_heuristics