Desidero sapere come la transazione viene implementata internamente in EJB. Voglio conoscere la logica che usano per creare una transazione. se si potesse segnalare alcuni articoli che potrebbero essere utilicome implementare il concetto di transazione in EJB
risposta
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()
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.
grazie per la risposta. Stavo parlando dell'implementazione della transazione nell'EJB o in qualsiasi implementazione JTA. –
Sono estremamente dispiaciuto, c'è un errore javascript nel mio browser. Ho upvoted per la tua risposta. –
@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. –
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?
- Transaction Manager chiedere database 1 se può commit della transazione corrente
- tal caso, chiedere banca dati 2 se può commit della transazione corrente
- Transaction Manager chiedere database 1 a commettere
- 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.
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 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. –
"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
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
Un'altra buona lettura sarebbe gli articoli JTS di Brian Goetz; link:
- 1. Jboss 7.1 EJB 2.1 personalizzato di configurazione timeout della transazione
- 2. Oggetto proxy in EJB
- 3. Un bean EJB può implementare più interfacce?
- 4. Come implementare il concetto di finestra di composizione di Gmail nelle applicazioni per pagina singola?
- 5. come implementare una transazione distribuita a lungo termine in j2ee
- 6. Comprendere il concetto di inode
- 7. È possibile propagare una transazione tra EJB di diverse applicazioni in Weblogic?
- 8. Come implementare il set vuoto - ∅?
- 9. Concetto di filettatura in C#
- 10. EJB: Evita il rollback delle transazioni
- 11. È possibile implementare il concetto mutex di C++ 11 per l'uso da std :: condition_variable?
- 12. riduttore concetto in Spark
- 13. concetto descrittore in NIC
- 14. Che cosa significa il concetto di trasferimento?
- 15. Qual è il concetto di bubbling?
- 16. Quale modello di progettazione utilizzare per implementare il meccanismo di transazione o concatenamento
- 17. Come funziona il concetto di pipeline di PowerShell?
- 18. Il thread è un concetto di Windows?
- 19. Puoi spiegare il concetto Web di RESTful?
- 20. EJB come controller
- 21. concetto di punto di sequenza in java
- 22. non autorizzati a creare transazione sul EntityManager condiviso - utilizzare le transazioni di primavera o EJB CMT
- 23. Cosa definisce il tradizionale concetto di "pagina" in MVC?
- 24. Impossibile caricare il modulo EJB
- 25. Multi-threading in EJB
- 26. Come eseguire il rollback di una transazione in Entity Framework
- 27. concetto di macchina astratto di jvm
- 28. @Singleton in java EJB
- 29. Qual è il concetto di un assieme in .NET?
- 30. Qual è il concetto di swimlane in YouTrack?
E come questo rispondere alla domanda del PO? – talonx
@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
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