Au début de l’informatique, les transactions distribuées n’étaient pas nécessaires. À mesure que le nombre d’applications augmentait, la synchronisation des données devenait un problème important. Les entreprises ont payé cher pour maintenir des systèmes synchronisés en termes de flux de données. En conséquence, le protocole de validation en 2 phases appelé XA (eXtended Architecture) est apparu. Ce protocole fournit des propriétés de type ACID pour le traitement global des transactions. Tout au long de cet article, je vais essayer d’expliquer les détails des transactions XA et l’utilisation de XA Transactions dans le framework Spring.

Le protocole d’engagement en 2 phases est un protocole d’engagement atomique pour les systèmes distribués. Ce protocole comme son nom l’indique se compose de deux phases. La première est la phase de demande de validation dans laquelle le gestionnaire de transactions coordonne toutes les ressources de transaction à valider ou à abandonner. Dans la phase de validation, le gestionnaire de transactions décide de finaliser l’opération en validant ou en abandonnant en fonction des votes de chaque ressource de transaction. Nous passerons ensuite aux détails de mise en œuvre du protocole 2PC.

Voir ici pour les ressources sur l’interopérabilité Java + .NET via 2PC.

Les transactions XA nécessitent un identifiant de transaction global et un identifiant de transaction local (xid) pour chaque ressource XA. Chaque ressource XA est inscrite dans XA Manager par la méthode start(xid). Cette méthode indique que XA Resource est impliqué dans la transaction (soyez prêt pour les opérations). Après cela, la première phase du protocole 2PC est réalisée en appelant la méthode prepare(xid). Cette méthode demande le vote OK ou ABORT de la ressource XA. Après avoir reçu le vote de chacune des ressources XA, le gestionnaire XA décide d’exécuter une opération commit(xid) si toutes les ressources XA envoient OK ou décide d’exécuter un rollback(xid) si une ressource XA envoie ABORT. Enfin, la méthode end(xid) est appelée pour chacune des ressources XA indiquant que la transaction est terminée. Regardez la figure pour mieux comprendre. Au fur et à mesure que nous construisons un arrière-plan dans la mise en œuvre des transactions XA, nous allons ensuite approfondir et voir taper cette commande cette commande cette commandes des échecs et des solutions possibles.


Des échecs peuvent survenir à tout moment en raison d’une perte de réseau, d’une machine en panne et d’une erreur de l’administrateur. Dans la transaction XA, nous catégoriserons ces défaillances selon les phases auxquelles elles se produisent. La première phase d’échec se situe avant le démarrage du protocole. Il s’agit d’un simple échec que le système n’a pas besoin de revenir en arrière ou de tout type d’opération. Nous ne faisons tout simplement pas l’opération pour ce moment particulier. Deuxième type cette commande cette commande cette commande d’échec peut se produire lors de la phase de préparation (demande de validation) qui peut être facilement gérée par des restaurations à l’aide de politiques de délai d’attente. Dernier point mais non le moindre, les échecs de phase de validation qui peuvent survenir en raison de restaurations incomplètes et de tout problème dans la chaîne. Dans toutes ces situations ci-dessus, le gestionnaire de transactions tente de résoudre le problème. Nous verrons ensuite comment le gestionnaire de transactions tente de surmonter les échecs.

Lors de la récupération, le gestionnaire de transactions appelle la méthode de récupération de chaque ressource XA. XA Resources trace les journaux et essaie de reconstruire sa dernière condition. Transaction Manager appelle les opérations de restauration nécessaires et la mission est accomplie. Ce processus peut sembler être un chemin heureux, mais il existe de nombreuses situations exceptionnelles où les journaux sont problématiques, comme être corrompus. Dans ce genre de situations, le gestionnaire de transactions suit certaines heuristiques pour résoudre le problème. De plus, le processus de récupération dépend des journaux à écriture anticipée dans lesquels vous écrivez des journaux d’opérations avant l’application. Pour les problèmes de performances, ces journaux sont écrits dans leur propre format (n’utilisant aucune sérialisation) et le système devrait mieux les regrouper si possible. Nous passons ensuite à la partie amusante qui est la prise en charge des transactions XA par le framework Spring.

Le framework Spring fournit un environnement étendu pour développer des applications Web et autonomes. Comme les autres utilitaires qu’il fournit, les transactions XA sont également prises en charge par Spring. Cependant, cette prise en charge n’est pas une implémentation native et nécessite une mise en veille prolongée, un conteneur Web ou un framework qui fournit la gestion des transactions XA. Spring a JtaTransactionManager qui fournit des utilitaires de gestion des transactions et masque les détails. De cette façon, nous pouvons avoir une gestion des transactions pour plusieurs DataSources qui sont mises à jour simultanément. Lorsqu’il s’agit d’utiliser la gestion des transactions XA, la prise en charge de l’hibernation et des conteneurs Web pour les transactions XA est bien documentée, il n’est pas nécessaire de la mentionner. Cependant, travailler avec un framework qui fournit des transactions XA peut prêter à confusion. Ainsi, je poursuivrai cet article en vous présentant Bitronix Transaction Manager.

Bitronix est facilement configurable tout en offrant un bon support pour la gestion des transactions. Il n’est pas couramment utilisé dans les applications autonomes, mais je vais essayer de donner la configuration pour une application autonome comme suit.

Nous pouvons maintenant avoir plusieurs sources de données qui peuvent être configurées comme suit. Chaque source de données doit avoir une propriété uniqueName qui est unique. La configuration ci-dessous est pour Oracle, d’autres bases de données peuvent avoir des configurations différentes. Pour tout autre détail, vous pouvez consulter le site Web de Bitronix.

Pour résumer, nous avons essayé d’expliquer ce qu’est XA Transactions, les protocoles sous-jacents et l’intégration de Bitronix Transaction Management avec Spring dans une application autonome. Pour étendre, XA Transactions propose de modifier différentes sources de données en même temps. De plus, les transactions XA sont prises en charge par des conteneurs Web ou des frameworks de type veille prolongée. Néanmoins, nous pouvons avoir besoin d’intégrer la gestion des transactions à une application autonome dans laquelle nous devons configurer le gestionnaire de transactions. En conséquence, la transaction XA fournit des opérations cohérentes sur plusieurs sources de données et les entreprises les utilisent.
Nous espérons que cet article vous a aidé avec How to Do XA Transactions (2 Phase Commit): A Simple Guide. Si vous avez d’autres questions, nous serons heureux de répondre aux vôtres; veuillez nous contacter dans la section ci-dessous. N’oubliez pas de partager signalfix.net avec votre famille et vos amis !