Supponiamo di avere un database (ad esempio Oracle) e un provider JMS (ad esempio HornetQ) che partecipa a una transazione XA. Un messaggio viene inviato a una coda JMS e alcuni dati vengono mantenuti nel database nella stessa transazione distribuita. Dopo il commit della transazione, un utente del messaggio leggerà i dati persistenti e li elaborerà in una transazione separata.Consistenza dei dati nelle transazioni XA
quanto riguarda la prima transazione XA, la seguente sequenza di eventi possono essere eseguiti dal gestore dell'operazione (ad esempio JBoss)
- preparare (HornetQ)
- preparare (Oracle)
- commit (HornetQ)
- commit (Oracle)
Cosa succede se il consumatore messaggio inizia la lettura dei dati dopo il commit è completato in HornetQ, ma è ancora in esecuzione in Oracle? Il consumatore del messaggio leggerà i dati obsoleti?
La domanda può essere generalizzata a qualsiasi tipo di più risorse che partecipano alle transazioni XA, ovvero esiste una possibilità per una finestra temporale piccola (quando vengono eseguite fasi di commit) in cui un lettore di un'altra transazione concorrente può ottenere uno stato incoerente (leggendo i dati commessi da una risorsa e i dati obsoleti da un'altra)?
Direi che l'unico modo in cui le risorse transazionali impediscono questo è bloccare tutti i lettori dei dati interessati una volta completata la fase di preparazione fino all'emissione del commit. In questo modo il consumatore di messaggi di esempio sopra menzionato bloccherebbe fino a quando i dati non saranno impegnati nel database.
Buona domanda, è il problema principale con JTA IMO, non è adeguatamente documentato, anche le specifiche sono troppo chiare per descrivere (come dovrebbe) un meccanismo così complesso. –
Inoltre, questo non è il caso di utilizzo peggiore, si pensi ai casi in cui si ha un errore sul commit quando l'implementatore di XAResource non copre il recupero. –
Specifiche dettagliate troppo lunghe per metterle in risposta, ma possono essere trovate in Oracle White Paper ["XA e Oracle Controlled Distributed Transactions"] (http://www.oracle.com/technetwork/products/clustering/overview/distributed -transactions-and-xa-163941.pdf) a pagina 12 nel capitolo "Transazioni distribuite e blocco del database". – ThinkJet