2010-09-23 11 views

risposta

0

Hibernate ha TransactionFactory:

Una fabbrica astratta per le istanze di transazione. Le implementazioni concrete sono specificate da hibernate.transaction.factory_class.

Ha implementazioni: JDBCTransactionFactory, JTATransactionFactory, CMTTransactionFactory. Queste fabbriche creano un'istanza di Transaction, ad esempio JDBCTransaction.

allora non posso dirvi cosa accade per JTA e CMT, ma per JDBC è così semplice come impostare l'auto-commit su false (quando si chiama iniziare una transazione):

connection.setAutoCommit(false); 

rispettivamente on transaction.commit(): connection.commit()

Se una qualsiasi eccezione si verifica quando si opera con la sessione, invoca connection.rollback()

+0

E come questo rispondere alla domanda del PO? – talonx

+0

@talonx la domanda era inizialmente su ibernazione. E la mia risposta lo spiega - mostra che _how_ è implementata la gestione delle transazioni. E dal momento che EJB può utilizzare Hibernate come JPA fornito, penso che sia giusto. Quale parte non ti è piaciuta? – Bozho

+0

grazie per aver chiarito questo. Forse l'OP ha modificato la domanda, perché non vedo alcun riferimento a Hibernate - nel qual caso non è una domanda specifica per Hibernate. – talonx

8

Hibernate non implementa tran sazioni, si basa su transazioni JDBC o transazioni JTA (gestite da container o gestite da applicazioni).

EJB Per quanto riguarda, se si vuole comprendere i dettagli di un JTA Transaction Manager, avrete bisogno di essere fluente con le interfacce JTA UserTransaction, TransactionManager e XAResource che sono descritti nel JTA specification. Lo JDBC API Tutorial and Reference, Third Edition sarà utile anche per comprendere la parte XA di un driver JDBC.

Quindi, ottenere i sorgenti di un contenitore EJB (come JBoss) o di un gestore di transazioni JTA standalone (come Atomikos) per analizzare la parte TM. E buona fortuna.

+0

grazie per la risposta. Stavo parlando dell'implementazione della transazione nell'EJB o in qualsiasi implementazione JTA. –

+0

Sono estremamente dispiaciuto, c'è un errore javascript nel mio browser. Ho upvoted per la tua risposta. –

+0

@Suresh Beh, nessun problema. Ma devo ammettere che sono rimasto sorpreso perché 1. non c'è niente di sbagliato nella mia risposta 2. Trovo difficile gettare le risposte alle vostre domande. Sentiti libero di ripristinarlo se si è trattato di un errore. –

1

Da EJB in Action libro

Il protocollo comunemente utilizzato per ottenere delle risorse multiplo è il commit in due fasi. Il protocollo di commit a due fasi esegue un ulteriore passo preparatorio prima del commit finale. Ogni gestore risorse coinvoltoviene richiesto se la transazione corrente può essere confermata con successo. Se qualcuno dei gestori delle risorse indica che la transazione non può essere impegnata se tentata, l'intera transazione viene abbandonata (ripristinata). In caso contrario, la transazione può proseguire e tutti i gestori di risorse sono invitati a eseguire il commit.

Un gestore risorse può essere un database, ad esempio. Altri esempi includono un servizio messaggi. Il componente che coordina le transazioni è chiamato gestore delle transazioni.

Supponiamo di avere un'applicazione che coinvolge due database distinti. In che modo Transaction manager esegue il proprio lavoro utilizzando il protocollo di commit a due fasi?

  1. Transaction Manager chiedere database 1 se può commit della transazione corrente
  2. tal caso, chiedere banca dati 2 se può commit della transazione corrente
  3. Transaction Manager chiedere database 1 a commettere
  4. Transaction Manager chiedere banca dati 2 impegnare

Sospensione è costruito sulla base delle API JDBC. Coordina solo un database. Quindi, se si chiama

session.commit(); 

Dietro le quinte, si chiama

connection.commit(); 

Se davvero si vuole studiare interni di transazione, il mio consiglio è Java Transaction Processing libro.

4

Questa domanda potrebbe avere risposte a molti livelli.

Una discussione generale di quello che sta succedendo può essere trovato here

mio sommario va in questo modo ... In primo luogo, da qualche parte ci deve essere un coordinatore di transazioni, il contenitore EJB si sapere il coordinatore - in genere che fa parte del il server delle applicazioni. Quindi tutto ciò che il contenitore EJB deve fare è chiamare

someobject.BeginTransaction() 

questo è tutto. L'API effettiva utilizzata dal contenitore EJB è JTA. Gli EJB possono effettivamente utilizzare la transazione di transazione Bean Managed o le transazioni gestite da Container. Nel caso Bean Managed, l'implementatore nhas effettua le chiamate JTA. Più solitamente usiamo le transazioni gestite da container (CMT). Nel qual caso il contenitore ha una logica che viene eseguita prima che venga raggiunta l'implementazione. Per esempio:

if (we're not already in a transaction) 
    begin transaction 

call the EJB implementation 

e poi il contenitore ha logica

if (finished processing request) 
    commit transaction 

con altri percorsi per interrompere la transazione, se gli errori sono successe.

Ora la logica è più complessa perché i bean EJB sono annotati con istruzioni di controllo delle transazioni. Ad esempio, puoi dire "se abbiamo già una transazione, usalo". Quindi se un EJB chiama un altro, viene utilizzata solo una singola transazione. Leggi le specifiche EJB per questo.

Tuttavia, tutto ciò è abbastanza ovvio in qualsiasi articolo di EJB Java EE. Quindi sospetto che tu stia chiedendo cosa succede all'interno di le chiamate JTA, come viene implementato il gestore delle transazioni e la sua relazione con i gestori delle risorse transazionali (ad esempio i database). Questo è un argomento enorme. In effetti, hai implementato le implementazioni del protocollo di transazione distribuito XA. Francamente dubito che tu abbia davvero bisogno di sapere questo. Ad un certo punto hai fiducia nelle API che stai utilizzando. Tuttavia, vi è un dettaglio chiave: il gestore delle transazioni (in genere il server delle applicazioni stesso) deve essere in grado di comunicare ai gestori di risorse fisiche il destino di ogni transazione e tali informazioni devono sopravvivere al riavvio del server delle app, quindi alcune informazioni persistenti sulla transazione deve essere tenuto Troverai i registri delle transazioni da qualche parte, e nella configurazione del server delle app devi assicurarti che i registri siano ben curati.

+1

+1 per aver menzionato XA, come il solito protocollo di base per i servizi di transazione J2EE. Va anche notato che JTA è una specifica di interfaccia - è fino a qualcun altro (Wbelogic, Websphere, Oracle, JBOSS ecc. Ecc.) Per fornire l'effettiva implementazione. –

+0

"l'implementatore" è il JTS? Come ho letto su Internet, JTA è "specifica" come l'API JDBC (analogia). Nel contesto di JTA, ho letto due termini: JTA, JTS, quindi JTS è l'implementazione di JTA? – CuriousMind

+0

No, JTS si occupa di alcuni dettagli di implementazione in JTA, Strettamente parlando, un'implementazione JTA potrebbe non utilizzare JTS, le specifiche JEE consigliano ma non impongono l'uso di JTS. JTS è un'implementazione per le specifiche di transazione CORBA OTS e riguarda le comunicazioni tra i gestori delle risorse e i gestori delle transazioni. Chiaramente, se l'implementazione JTA utilizza JTS, è probabile che sia in grado di trovare altri gestori risorse che parlano tale protocollo, motivo per cui JEE ne raccomanda l'uso. – djna

Problemi correlati