Antworten:
JPA-Implementierungen haben die Wahl, Transaktionen selbst zu verwalten ( RESOURCE_LOCAL
) oder von der JTA-Implementierung des Anwendungsservers verwalten zu lassen.
In den meisten Fällen ist RESOURCE_LOCAL in Ordnung. Dies würde grundlegende Transaktionen auf JDBC-Ebene verwenden. Der Nachteil ist, dass die Transaktion lokal für die JPA-Persistenz-Einheit ist. Wenn Sie also eine Transaktion wünschen, die mehrere Persistenz-Einheiten (oder andere Datenbanken) umfasst, ist RESOURCE_LOCAL möglicherweise nicht gut genug.
JTA wird auch zum Verwalten von Transaktionen zwischen Systemen wie JMS und JCA verwendet, aber das ist für die meisten von uns eine ziemlich exotische Verwendung.
Um JTA verwenden zu können, benötigen Sie Unterstützung auf Ihrem Anwendungsserver sowie Unterstützung vom JDBC-Treiber.
Als Ergänzung zu anderen Antworten
Hier ist ein Auszug aus dem äußerst nützlichen Artikel (veröffentlicht auf der Apache TomEE- Website), der auch bei der Beantwortung der ersten Frage des OP helfen kann (der Link zum Artikel befindet sich unten).
Vergleichen der Persistenzkontexte RESOURCE_LOCAL und JTA
Mit <persistence-unit transaction-type = "RESOURCE_LOCAL"> sind SIE für die Erstellung und Verfolgung von EntityManager (PersistenceContext / Cache) verantwortlich ...
- Sie müssen die EntityManagerFactory verwenden , um einen EntityManager abzurufen
- Die resultierende EntityManager- Instanz ist ein PersistenceContext / Cache
- Eine EntityManagerFactory kann nur über die Annotation @PersistenceUnit eingefügt werden (nicht über @PersistenceContext).
- Sie dürfen @PersistenceContext nicht verwenden, um auf eine Einheit vom Typ RESOURCE_LOCAL zu verweisen
- Sie müssen die EntityTransaction- API verwenden, um jeden Aufruf Ihres EntityManger zu starten / festzuschreiben
- Das zweimalige Aufrufen von entityManagerFactory.createEntityManager () führt zu zwei separaten EntityManager-Instanzen und damit zu zwei separaten PersistenceContexts / Caches.
- Es ist fast nie eine gute Idee, mehr als eine Instanz eines EntityManager zu verwenden (erstellen Sie keine zweite, es sei denn, Sie haben die erste zerstört).
Mit <persistence-unit transaction-type = "JTA"> erstellt und verfolgt der CONTAINER den EntityManager (PersistenceContext / Cache) ...
- Sie können die EntityManagerFactory nicht verwenden , um einen EntityManager abzurufen
- Sie können nur einen EntityManager erhalten, der vom Container bereitgestellt wird
- Ein EntityManager kann nur über die Annotation @PersistenceContext eingefügt werden (nicht über @PersistenceUnit).
- Sie dürfen @PersistenceUnit nicht verwenden, um auf eine Einheit vom Typ JTA zu verweisen
- Der vom Container angegebene EntityManager verweist auf den PersistenceContext / Cache, der einer JTA-Transaktion zugeordnet ist.
- Wenn keine JTA-Transaktion ausgeführt wird, kann der EntityManager nicht verwendet werden, da kein PersistenceContext / Cache vorhanden ist.
- Jeder Benutzer mit einem EntityManager-Verweis auf dieselbe Einheit in derselben Transaktion hat automatisch einen Verweis auf denselben PersistenceContext / Cache
- Der PersistenceContext / Cache wird zum Zeitpunkt der JTA- Festschreibung geleert und gelöscht
Wenn Sie die Java Persistence API lernen möchten, tun Sie sich selbst einen Gefallen und lesen Sie den vollständigen Artikel hier: JPA-Konzepte: JPA 101 .
transaction-type=RESOURCE_LOCAL
und @PersistenceContext
und @Transactional
verwaltet von Spring
Resource_Local und JTA sind Transaktionsmanager (Methoden zum Ausführen von Transaktionen). Dies ist nicht die Eigenschaft der Datenbank, sondern die Komponente, die für die Koordination von Transaktionen verantwortlich ist. JPA- und JTA-Transaktionsmanager sind unterschiedlich. Der JPA-Transaktionsmanager ist für JPA-Transaktionen verantwortlich und Sie möchten eine verwenden, wenn Sie nur eine JPA-Transaktion ausführen. Der JTA-Transaktionsmanager ist ein Allzweck-Transaktionsmanager und kann andere Ressourcen wie JMS-Warteschlangen in die Transaktion einbeziehen. In der Regel verwenden Java EE-Container einen JTA-Transaktionsmanager für EJBs, JPA-Entitäten usw.
resource_local vs JTA geht es um lokale Transaktion vs globale Transaktion. Es geht darum, wie wir mehrere Ressourcen unter einer einzigen Transaktion verwalten können.
Bei CMT vs BMT geht es darum, wer die Transaktion öffnet und schließt - Anwendungsentwickler oder Anwendungsserver.