2013-07-06 4 views
8

Die Hibernate docs zeigt dieses Beispiel:Hibernate Nurlesetransaktion

session = sessionFactory.openSession(); 
session.beginTransaction(); 
List result = session.createQuery("from Event").list(); 
for (Event event : (List<Event>) result) { 
    System.out.println("Event (" + event.getDate() + ") : " + 
     event.getTitle()); 
} 
session.getTransaction().commit(); 
session.close(); 

Warum ist es notwendig, die session.getTransaction().commit() obwohl die Ereignisliste auszuführen lediglich ausgedruckt wurde?

Antwort

11

SELECT erfordert auch eine Transaktion. Es ist unmöglich, SELECT ohne irgendeine Transaktion auszuführen. Die Tatsache, dass Sie eine Transaktion nicht explizit starten und beenden müssen, wenn Sie mit einigen SQL-GUI-Tools Daten aus der Datenbank auswählen, ist, dass diese Tools den Modus autocommit verwenden. Im Autocommit-Modus wird die Datenbank automatisch gestartet und die Transaktion für jede einzelne SQL-Anweisung festgeschrieben, sodass Sie die Transaktionsgrenze nicht explizit deklarieren müssen.

Wenn Sie eine Transaktion nicht beenden (z. B. Festschreibung oder Rollback), wird die Datenbankverbindung, die von dieser Transaktion verwendet wird, nicht freigegeben, und der Datenbank werden schließlich die verfügbaren Verbindungen ausgegangen.

Für den Ruhezustand verwendet es standardmäßig den Nicht-Autocommit-Modus (der durch die Eigenschaft hibernate.connection.autocommit angegeben wird). Also müssen wir die Transaktionsgrenze deklarieren und sicherstellen, dass die Transaktion endet.

Aber wenn Sie Abfragedaten Hibernate API verwenden, ist es in Ordnung ist, auch wegen der folgenden nicht explizit der Transaktionsgrenze erklären:

  1. Datenbank wird in der Regel eine neue Transaktion automatisch gestartet werden, wenn die aktuelle SQL Anweisung erfordert eine und keine Transaktion wird explizit zuvor gestartet.

  2. Session.close() wird den zugrunde liegenden Connection .Nach der JDBC-Spezifikation close(), wenn java.sql.Connection#close() genannt wird und es eine aktive Transaktion, das Ergebnis dieser aktiven Transaktion ist abhängig von dem JDBC-Anbieter ‚s Implementierung. In der Regel wird der JDBC-Treiber diese Transaktion automatisch festschreiben oder zurücksetzen. In diesem Fall spielt es jedoch keine Rolle, ob die Transaktion festgeschrieben oder zurückgesetzt wird, da Sie die gewünschten Daten bereits erhalten haben.

+0

Danke für die ausführliche Antwort –