XA Transactions (2 Phase Commit): A Simple Guide

Nei primi giorni di calcolo, 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, è sorto il protocollo di commit a 2 fasi denominato XA(eXtended Architecture). Questo protocollo fornisce proprietà ACID-like per l’elaborazione delle transazioni globali. In questo articolo, cercherò di spiegare i dettagli delle transazioni XA e l’uso delle transazioni XA in Spring framework.

2 phase commit protocol è un protocollo di commit atomico per sistemi distribuiti. Questo protocollo, come suggerisce il nome, si compone di due fasi. Il primo è la fase di commit-request in cui transaction manager coordina tutte le risorse della transazione per eseguire il commit o l’interruzione. Nella fase di commit, transaction manager decide di finalizzare l’operazione eseguendo il commit o l’interruzione in base ai voti di ciascuna risorsa di transazione. Passeremo poi ai dettagli di implementazione del protocollo 2PC.
*Vedi qui per le risorse su Java+. NET Interoperabilità attraverso 2PC.

Le transazioni XA richiedono un ID transazione globale e un ID transazione locale(xid) per ogni risorsa XA. Ogni risorsa XA viene arruolata in XA Manager con il 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 OK o ABORT vote 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 l’INTERRUZIONE. Infine, il metodo end(xid) viene chiamato per ciascuna risorsa XA che indica che la transazione è stata completata. Guarda la figura per capire meglio. Mentre costruiamo uno sfondo nell’implementazione delle transazioni XA, andremo più in profondità e vedremo i tipi di errori e le possibili soluzioni.


Gli errori possono verificarsi in qualsiasi momento a causa di perdita di rete, macchina giù e qualche errore di 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 che il sistema non ha bisogno di rollback o qualsiasi tipo di operazione. Semplicemente non facciamo l’operazione per quel particolare momento. Il secondo tipo di errore può verificarsi nella fase di preparazione(commit-request) che può essere facilmente gestita dai rollback utilizzando i criteri di timeout. Ultimo ma non meno importante è commettere errori di fase che possono verificarsi a causa di rollback incompleti e qualsiasi problema nella catena. In tutte queste situazioni di cui sopra, transaction manager tenta di recuperare il problema. Vedremo poi come transaction manager cerca di superare i fallimenti.

Per il recupero, transaction manager chiama recover metodo di ogni risorsa XA. Le risorse XA tracciano i registri e cercano di ricostruire la sua ultima condizione. Transaction Manager chiama le operazioni di rollback necessarie 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 corrotti. In questo tipo di situazioni, transaction manager 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. Per problemi di prestazioni questi registri sono scritti nel loro formato (non utilizzando alcuna serializzazione) e il sistema dovrebbe meglio batch, se possibile. Passiamo alla parte divertente che è il supporto delle transazioni XA di Spring framework.

Spring framework fornisce un ampio ambiente per sviluppare applicazioni web e stand alone. Come altre utility che fornisce, le transazioni XA sono supportate anche da Spring. Tuttavia, questo supporto non è un’implementazione nativa e richiede hibernate, contenitore Web o un framework che fornisce la gestione delle transazioni XA. 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ù fonti di dati che vengono aggiornate contemporaneamente. Quando si tratta di utilizzare la gestione delle transazioni XA, il supporto di ibernazione e contenitori Web per le transazioni XA sono ben documentati, non è necessario menzionare. Tuttavia, lavorare con un framework che fornisce transazioni XA può essere fonte di confusione. Quindi, continuerò questo post introducendo Bitronix Transaction Manager.

Bitronix è facilmente configurabile fornendo un buon supporto per la gestione delle transazioni. Non è comunemente usato in applicazioni stand-alone, ma cercherò di fornire la configurazione per l’applicazione stand-alone come segue.

<bean factory-method="getConfiguration" class="bitronix.tm.TransactionManagerServices"> <!--Disabling Jmx avoids registering JMX Beans to any container--> <property name="disableJmx" value="true" /></bean><bean factory-method="getTransactionManager" class="bitronix.tm.TransactionManagerServices" depends-on="bitronixTMConfig" destroy-method="shutdown"/><bean class="org.springframework.transaction.jta.JtaTransactionManager"> <property name="transactionManager" ref="bitronixTM" /> <property name="userTransaction" ref="bitronixTM" /> <property name="allowCustomIsolationLevels" value="true" /></bean>

Ora possiamo avere più origini dati che possono essere configurate come segue. Ogni origine dati dovrebbe avere una proprietà uniqueName che è unica. Sotto la configurazione è per Oracle, altri database possono avere configurazioni diverse. Per qualsiasi altro dettaglio, puoi controllare il sito web Bitronix.

<bean class="bitronix.tm.resource.jdbc.PoolingDataSource" init-method="init" destroy-method="close"> <property name="uniqueName" value="xaDataSource" /> <property name="minPoolSize" value="1" /> <property name="maxPoolSize" value="4" /> <property name="testQuery" value="SELECT 1 FROM dual" /> <property name="driverProperties"> <props> <prop key="URL">jdbc:oracle:thin:@10.6.86.24:1521:test</prop> <prop key="user">test</prop> <prop key="password">test</prop> </props> </property> <property name="className" value="oracle.jdbc.xa.client.OracleXADataSource" /> <property name="allowLocalTransactions" value="true" /></bean>

Per riassumere, abbiamo cercato di spiegare cosa sono le transazioni XA, i protocolli sottostanti e l’integrazione di gestione delle transazioni Bitronix con Spring in un’applicazione stand alone. Per estendere, Transazioni XA prevede la modifica di diverse origini dati allo stesso tempo. Inoltre, le transazioni XA sono supportate da contenitori Web o ibernazione come framework. Tuttavia, potrebbe essere necessario integrare la gestione delle transazioni in un’applicazione stand alone in cui è necessario configurare transaction manager. Di conseguenza, la transazione XA fornisce operazioni coerenti su più origini dati e le aziende ne fanno uso.
*Note del curatore e risorse aggiuntive

You might also like

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.