Benötigen Sie eine Datenbanktransaktion zum Lesen von Daten?

10

Wenn ich versuche, Daten aus der Datenbank zu lesen, zumindest mit

((Session)em.getDelegate()).createCriteria()

Eine Ausnahme ist throws, die besagt, dass eine Transaktion nicht vorhanden ist.

Wenn ich die Anmerkung hinzufüge:

%Vor%

es funktioniert gut.

Da jedoch das Lesen millionenfach pro Sekunde stattfindet, um auf Daten zuzugreifen und sie zu lesen, möchte ich sicherstellen, dass unsere Umgebung nicht unnötig verstopft wird.

Wenn nicht, was kostet das Erstellen einer schreibgeschützten Propagation.Supports Transaktion?

Kann ich keine Hibernate-Kriterienabfrage ohne eine Transaktion in Kombination mit Spring erstellen?

    
momomo 12.10.2014, 16:22
quelle

2 Antworten

48

Alle Datenbankanweisungen werden im Rahmen einer physischen Transaktion ausgeführt, , selbst wenn wir Transaktionsgrenzen nicht explizit deklarieren (BEGIN / COMMIT / ROLLBACK).

Wenn Sie Transaktionsgrenzen nicht deklarieren, muss jede Anweisung in einer separaten Transaktion ausgeführt werden ( autocommit mode). Dies kann sogar dazu führen, dass eine Verbindung pro Anweisung geöffnet und geschlossen wird, es sei denn, Ihre Umgebung kann die Verbindung pro Thread verarbeiten.

Wenn Sie einen Service als @Transactional deklarieren, erhalten Sie eine Verbindung für die gesamte Transaktionsdauer, und alle Anweisungen verwenden diese einzelne Isolationsverbindung. Dies ist viel besser, als überhaupt keine expliziten Transaktionen zu verwenden.

In großen Anwendungen können Sie viele gleichzeitige Anforderungen haben und die Datenbankverbindungsanforderungsrate verringern wird definitiv Ihre allgemeine Anwendungsleistung verbessern.

JPA erzwingt keine Transaktionen bei Leseoperationen. Nur Schreibvorgänge führen dazu, dass eine Ausnahme mit Transaktionsanforderung ausgelöst wird, falls Sie vergessen, einen Transaktionskontext zu starten. Dennoch ist es immer besser, Transaktionsgrenzen auch für schreibgeschützte Transaktionen zu deklarieren (in Spring @Transactional können Sie schreibgeschützte Transaktionen markieren, was einen großen Leistungsvorteil hat).

Wenn Sie jetzt deklarative Transaktionsgrenzen verwenden (z. B. @Transactional ), müssen Sie sicherstellen, dass die Erfassung der Datenbankverbindung verzögert wird, bis eine JDBC-Anweisung ausgeführt wird. In JTA ist dies das Standardverhalten. Wenn Sie RESOURCE_LOCAL verwenden, müssen Sie festlegen hibernate.connection.provider_disables_autocommit Konfigurationseigenschaft und stellen Sie sicher, dass der zugrundeliegende Verbindungspool den automatischen Festschreibungsmodus deaktiviert.

    
Vlad Mihalcea 12.10.2014, 16:48
quelle
1

Nach meinen Erfahrungen mit der JPA Implementierung in J2EE wird immer ein Transaktionsmanager benötigt, um CRUD auszuführen. starke> Betriebssicherheit, indem ein Rollback garantiert wird, um die Datenintegrität zu wahren.

  

Unternehmensanwendungen verwenden unterschiedliche Ressourcen, um Daten zu speichern und Nachrichten wie eine Datenbank oder Nachrichtenwarteschlange zu senden. Wenn wir diese Ressourcen sequentiell abfragen und die gesamte Operation abbrechen möchten, sobald ein Problem auftritt, müssen wir diese Abfrage in eine Arbeitseinheit einfügen, damit sie als Ganzes ausgeführt wird.

Sie könnten es definieren:

  • unter Verwendung verwandter Anmerkungen (wie in den Fragen gezeigt); Auf diese Weise lädt der Container automatisch den Transaktionsmanager für einen bestimmten Persistenzkontext;

  • durch manuelle Injektion des Transaktionsmanagers, wie folgt:

    %Vor%

Spring Data kann bei der JPA-Spec-Implementierung dem gleichen Ansatz folgen.

Weitere Informationen finden Sie in folgendem Artikel: Java_Persistence / Transaktionen .

    
vdenotaris 12.10.2014 16:48
quelle

Tags und Links