2014-04-16 7 views

Antwort

6

Mein Verständnis ist, dass, wenn Hibernate autocommits, dann ein Flush, die durch teilweise versagt wird nicht rückgängig gemacht werden. Sie haben ein unvollständiges/gebrochenes Objektdiagramm.

Wenn Sie eine Verbindung mit autocommit auf etwas wollen, können Sie immer auszupacken ein neu Session erstellt die zugrunde liegende JDBC-Verbindung zu bekommen, setAutocommit(true) auf sich, tun Sie Ihre Arbeit über JDBC-APIs, setAutocommit(false), und die Sitzung zu schließen. Ich würde nicht empfehlen, dies auf einem Session tun, das ist schon alles getan.

+0

Hibernate verwendet JDBC unter der Haube. autoCommit ist ein Konzept von JDBCConnection, was "Transaktion pro Anweisung" bedeutet. Bereich der transactionsn = 1 SQL-Anweisung [autocommit = true] hibernate.connection.autoCommit = true macht jede Anweisung Commited einmal abgeschlossen ist, so dass wir nicht committe/rollback 2 oder mehr Anweisungen als Teil der einzelnen Einheit der Arbeit. Wir wollen- entweder alle Anweisungen ausgeführt oder keine ausgeführt - dafür müssen wir Anfang und Ende der Transaktion markieren und wir müssen AutoCommit deaktivieren. –

+0

hibernate.connection.autocommit = false 2 Szenarien explizite Transaktionsgrenze. sessionFactory.openSession() session.beginTransaction() session.getTransaction commit()() // Flushes Session, Verpflichtet Txn Sitzung. close() impliziten Transaktionsgrenze sessionFactory.openSession() // keine Transaktionsnutzung Siehe // aber die implizite TXN weil - Autocommit falsch ist session.flush() session.Close() hier - Wenn wir die Sitzung schließen, ist Spezifisch action ist nicht klar so herstellerspezifisches Verhalten in Oracle - alle SQL-Anweisungen erhalten in postgresql committed - alle SQL-Anweisungen zurückgesetzt –

10

Standardmäßig ist der Autocommit-Wert false, daher muss die Transaktion explizit festgelegt werden. Dies könnte der Grund sein, warum die Änderungen nicht in der Datenbank widergespiegelt werden, sonst kann flush versuchen, die Änderungen vor dem Festschreiben zu erzwingen.

Wenn Sie die Sitzung schließen, wird sie implizit in der Datenbank festgeschrieben [hängt von der Implementierung ab].

Wenn Sie Cascading-Transaktionen haben & Rollback für Atomarität müssen Sie die Kontrolle über Transaktionen haben & in diesem Fall sollte Autocommit falsch sein.

Entweder Autocommit als wahr setzen oder Transaktionen explizit behandeln.

Here ist eine gute Erklärung darauf.

Hibernate forum im Zusammenhang damit.

Stackoverflow question darauf.

4

Alle Datenbank-Anweisungen werden im Rahmen einer physischen Transaktion ausgeführt, even when we don’t explicitly declare transaction boundaries (BEGIN/COMMIT/ROLLBACK).

Wenn Sie nicht über die Transaktionsgrenzen erklären, dann wird jede Äußerung in einer separaten Transaktion ausgeführt werden. Dies kann sogar dazu führen, dass eine Verbindung pro Anweisung geöffnet und geschlossen wird.

Deklarieren einen Dienst als @Transactional werden Ihnen eine Verbindung für die gesamte Transaktionsdauer geben, und alle Aussagen werden, dass einzelne Isolations Verbindung verwenden. Dies ist viel besser, als überhaupt keine expliziten Transaktionen zu verwenden. Bei großen Anwendungen können Sie viele gleichzeitige Anfragen haben und reducing database connection acquiring request rate verbessert auf jeden Fall Ihre allgemeine Anwendungsleistung.

So ist die Faustregel:

  1. Wenn Sie schreibgeschützte Transaktionen, die nur eine Abfrage ausführen, können Sie auto-commit für diejenigen ermöglichen.

  2. Wenn Transaktionen mit mehr als einer Anweisung enthalten sind, müssen Sie die automatische Festschreibung deaktivieren, da alle Vorgänge in einer einzigen Arbeitseinheit ausgeführt werden sollen und Sie keinen zusätzlichen Druck auf sie ausüben möchten Ihr Verbindungspool.

2

Sie das nicht Session-per-Operation Antipattern benutzen Sie eine Session für jeden einfachen Datenbank-Aufruf in einem einzigen Thread nicht öffnen und schließen. Das Gleiche gilt für Datenbanktransaktionen. Datenbankaufrufe in einer Anwendung werden mithilfe einer geplanten Sequenz ausgeführt. sie sind in atomare Arbeitseinheiten gruppiert. Dies bedeutet auch, dass das automatische Festschreiben nach jeder einzelnen SQL-Anweisung in einer Anwendung nutzlos ist, da dieser Modus für die Ad-hoc-SQL-Konsolenarbeit vorgesehen ist. Hibernate deaktiviert oder erwartet, dass der Anwendungsserver den automatischen Festschreibungsmodus sofort deaktiviert. Datenbanktransaktionen sind niemals optional. Die gesamte Kommunikation mit einer Datenbank muss innerhalb einer Transaktion stattfinden. Auto-Commit-Verhalten zum Lesen von Daten sollte vermieden werden, da es unwahrscheinlich ist, dass viele kleine Transaktionen besser abschneiden als eine klar definierte Arbeitseinheit. Letzteres ist auch wartbarer und erweiterbar.

find more information on this topic

Verwandte Themen