Agli albori dell’informatica non c’era bisogno di transazioni distribuite. Con l’aumento del numero di applicazioni, la sincronizzazione dei dati diventa un problema importante. Le aziende hanno pagato molto per mantenere i sistemi sincronizzati in termini di flusso di dati. Di conseguenza, è nato il protocollo di commit a 2 fasi denominato XA (eXtended Architecture). Questo protocollo fornisce proprietà simili all’ACID per l’elaborazione delle transazioni globali. In questo articolo, cercherò di spiegare i dettagli delle transazioni XA e l’uso di XA Transactions nel framework Spring.

Il protocollo di commit a 2 fasi è un protocollo di commit atomico per sistemi distribuiti. Questo protocollo, come suggerisce il nome, si compone di due fasi. La prima è la fase di richiesta di commit in cui il gestore delle transazioni coordina tutte le risorse della transazione per il commit o l’interruzione. Nella fase di commit, il gestore delle transazioni decide di finalizzare l’operazione eseguendo il commit o l’interruzione in base ai voti di ciascuna risorsa di transazione. Passeremo quindi ai dettagli di implementazione del protocollo 2PC.

Vedi qui per le risorse su Java + .NET Interoperabilità tramite 2PC.

Le transazioni XA richiedono un ID transazione globale e un ID transazione locale (xid) per ciascuna risorsa XA. Ogni risorsa XA viene arruolata in XA Manager dal metodo start(xid). Questo metodo indica che la risorsa XA è coinvolta nella transazione (essere pronti per le operazioni). Successivamente, la prima fase del protocollo 2PC viene realizzata chiamando il metodo prepare(xid). Questo metodo richiede il voto OK o ABORT dalla risorsa XA. Dopo aver ricevuto il voto da ciascuna risorsa XA, XA Manager decide di eseguire un’operazione di commit(xid) se tutte le risorse XA inviano OK o decide di eseguire un rollback(xid) se una risorsa XA invia ABORT. Infine, viene chiamato il metodo end(xid) per ciascuna risorsa XA che indica che la transazione è stata completata. Guarda la figura per capire meglio. Man mano che costruiamo uno sfondo nell’implementazione della transazione XA, andremo più in profondità e vedremo digitare questo comando questo comando questo comando di errori e possibili soluzioni.


I guasti possono verificarsi in qualsiasi momento a causa della perdita di rete, del fermo macchina e di qualche errore dell’amministratore. Nella transazione XA, classificheremo questi errori in base alle fasi in cui si verificano. La prima fase di errore è prima dell’avvio del protocollo. Questo è un semplice errore di cui il sistema non ha bisogno per eseguire il rollback o qualsiasi tipo di operazione. Semplicemente non eseguiamo l’operazione per quel particolare momento. In secondo luogo, digita questo comando questo comando questo comando di errore può verificarsi nella fase di preparazione (commit-request) che può essere facilmente gestita dai rollback utilizzando le politiche di timeout. Ultimo ma non meno importante, sono gli errori della fase di commit che possono verificarsi a causa di rollback incompleti e qualsiasi problema nella catena. In tutte queste situazioni di cui sopra, il gestore delle transazioni cerca di risolvere il problema. Vedremo poi come il gestore delle transazioni cerca di superare i fallimenti.

Al momento del ripristino, il gestore delle transazioni chiama il metodo di ripristino di ciascuna risorsa XA. XA Resources traccia i log e tenta di ricostruire la sua condizione più recente. Il Transaction Manager chiama le necessarie operazioni di rollback e la missione è compiuta. Questo processo può sembrare un percorso felice, ma ci sono molte situazioni eccezionali in cui i registri sono problematici come essere danneggiati. In questo tipo di situazioni, il gestore delle transazioni segue alcune euristiche per risolvere il problema. Inoltre, il processo di ripristino dipende dai registri write-ahead in cui si scrivono i registri delle operazioni prima dell’applicazione. In caso di problemi di prestazioni, questi registri vengono scritti nel proprio formato (non utilizzando alcuna serializzazione) e il sistema dovrebbe eseguirli in batch meglio, se possibile. Passiamo quindi alla parte divertente che è il supporto delle transazioni XA da parte del framework Spring.

Il framework Spring fornisce un ampio ambiente per lo sviluppo di applicazioni web e autonome. Come altre utilità che fornisce, anche le transazioni XA sono supportate da Spring. Tuttavia, questo supporto non è un’implementazione nativa e richiede l’ibernazione, un contenitore Web o un framework che fornisca XA Transaction Management. Spring ha JtaTransactionManager che fornisce utilità di gestione delle transazioni e nasconde i dettagli. In questo modo possiamo avere la gestione delle transazioni per più DataSource che vengono aggiornate contemporaneamente. Quando si tratta di utilizzare XA Transaction Management, l’ibernazione e il supporto dei contenitori Web per le transazioni XA sono ben documentati, non è necessario menzionarli. Tuttavia, lavorare con un framework che fornisce transazioni XA può creare confusione. Pertanto, continuerò questo post presentando Bitronix Transaction Manager.

Bitronix è facilmente configurabile fornendo un buon supporto per la gestione delle transazioni. Non è comunemente usato nelle applicazioni autonome, ma proverò a fornire la configurazione per l’applicazione autonoma come segue.

Ora possiamo avere più origini dati che possono essere configurate come segue. Ogni origine dati deve avere una proprietà uniqueName che è univoca. La configurazione di seguito è per Oracle, altri database possono avere configurazioni diverse. Su qualsiasi altro dettaglio, puoi controllare il sito web di Bitronix.

Per riassumere, abbiamo cercato di spiegare cos’è XA Transactions, i protocolli sottostanti e l’integrazione di Bitronix Transaction Management con Spring in un’applicazione stand alone. Per estendere, XA Transactions consente di modificare diverse origini dati contemporaneamente. Inoltre, le transazioni XA sono supportate da contenitori Web o si ibernano come framework. Tuttavia, potrebbe essere necessario integrare la gestione delle transazioni in un’applicazione autonoma in cui è necessario configurare il gestore delle transazioni. Di conseguenza, la transazione XA fornisce operazioni coerenti su più origini dati e le aziende le utilizzano.
Ci auguriamo che questo articolo ti abbia aiutato con Come eseguire transazioni XA (commit 2 fasi): una guida semplice. Se hai altre domande, saremo felici di rispondere alle tue; contattaci nella sezione sottostante. Non dimenticare di condividere signalfix.net con la tua famiglia e i tuoi amici!