Se ho accesso UserTransaction questo non significa che io uso 2 phase commit o XA?
-
19-09-2019 - |
Domanda
UserTransaction ut=cerca....ut.beginTransaction();saveToFooDB();statelessEjb.transactionSupportedMethod();//salva qualcosa ai Foo DB saveToFooDB();ut.commit();
Se stavo facendo la precedenza, quindi la mia comprensione è che non è una transazione XA, in quanto non si estendono su più risorse (come DB plus JMS).È la mia comprensione è corretta?
Soluzione
Fonte di dati può essere configurato in due tipi:
- XA:questi datasource può partecipare a distribuire le transazioni
- Locale:chiamato anche non-XA, e non possono partecipare in una transazione distribuita
Il UserTransaction
è definito in JTA specifiche che descrivono come coordinare il partecipante in una transazione distribuita.
L'applicazione server che implementa il JTA specifica è tuttavia libero di fare un sacco di ottimizzazioni.Uno di questi è il last-agent-optimization
, che consente l'ultimo partecipante alla transazione distribuita da Locale.Un normale commettere è fatto per gli ultimi partecipanti.Se c'è un solo partecipante, allora è sempre il caso.
In breve:
- se si dispone di più di un partecipante, XA e 2 phase commit devono essere utilizzati
- se c'è un solo partecipante, la maggior parte delle applicazioni di supporto del server di origine dati locale e non usare il full-soffiano 2 phase commit protocol.
Glassfish vedere:
MODIFICA
Paragrafo "ambito di transazione" di glassfish documentazione lo spiega meglio di me.Immagino sia lo stesso per tutti i server di applicazioni.
Una transazione locale coinvolge una sola non XA risorse e richiede che tutti i partecipano i componenti dell'applicazione eseguire interno di un unico processo. Locale operazione di ottimizzazione è specifico per il gestore delle risorse e trasparente per Java EE applicazione.
Nel Server di Applicazioni, una JDBC risorsa non è XA se soddisfa uno dei i seguenti criteri:
In connessione JDBC piscina configurazione, l'Origine di classe non implementare il javax.sql.XADataSource interfaccia.
La Transazione Globale di Supporto casella non è selezionata, o la Risorsa Tipo di impostazione non esiste o non è set di javax.sql.XADataSource.
Una transazione rimane locali se l' seguenti condizioni rimangono true:
- Uno e un solo non-XA risorsa è utilizzata.Se ulteriori camere non-XA risorsa, l'operazione è interrotta.
- Nessuna operazione di importazione o esportazione di verifica.
Le transazioni che coinvolgono più risorse o più partecipanti i processi vengono distribuite o globale transazioni.Una transazione globale, può coinvolgere un non-XA ultima risorsa, se agente di ottimizzazione è attivata.In caso contrario, tutte le risorse devono essere XA.L'uso-ultima-agente-ottimizzazione la proprietà è impostata su true per impostazione predefinita.Per dettagli su come impostare questo proprietà, vedere Configurazione del Operazione Di Servizio.
Se solo uno XA risorsa è utilizzata in un transazione, a seguito di una fase di commit si verifica, altrimenti la transazione è coordinato con un commit in due fasi il protocollo.
Altri suggerimenti
Una volta che si avvia l'UserTransaction, e quindi ottenere una connessione alla risorsa (ad esempio banche dati) utilizzando una connessione-fabbrica che è dichiarato XA-solidale, vuol dire che il collegamento diventerà parte della transazione XA. Inoltre, non importa affatto se ci si connette a tipi singole o multiple di risorse come JMS e il database.
La speranza che aiuta.
Nitin