2013-07-06 17 views
8

hibernacji docs pokazać ten przykład:Hibernate Read-Only transakcja

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(); 

Dlaczego jest to konieczne do wykonywania session.getTransaction().commit() chociaż lista zdarzeń była jedynie wydrukować?

Odpowiedz

11

SELECT wymaga również transakcji. Niemożliwe jest wykonanie SELECT bez żadnej transakcji. Fakt, że nie trzeba jawnie rozpoczynać i kończyć transakcji podczas wybierania danych z bazy danych przy użyciu niektórych narzędzi SQL GUI, oznacza, że ​​te narzędzia używają trybu autocommit. W trybie automatycznego zatwierdzania baza danych automatycznie rozpocznie i zatwierdza transakcję dla każdej pojedynczej instrukcji SQL, tak że nie trzeba jawnie deklarować granicy transakcji.

Jeśli transakcja nie zostanie zakończona (tzn. Nie zostanie zatwierdzona lub wycofana), połączenie z bazą danych używane przez tę transakcję nie zostanie zwolnione, a baza danych w ostateczności zabraknie dostępnych połączeń.

W przypadku hibernacji domyślnie korzysta z trybu nieautentycznego (określanego przez właściwość hibernate.connection.autocommit). Musimy więc zadeklarować granicę transakcji i upewnić się, że transakcja się kończy.

ale jeśli tylko dane zapytań przy użyciu hibernacji API, to jest w porządku, nawet nie jawnie zadeklarować granicę transakcji z powodu następujących:

  1. Database zazwyczaj rozpocząć nową transakcję automatycznie gdy prąd SQL instrukcja wymaga jednej, a żadna transakcja nie jest jawnie rozpoczęta wcześniej.

  2. Session.close() będzie close() instrumencie bazowym Connection .Według specyfikacji JDBC, jeśli java.sql.Connection#close() nazywa i jest aktywna transakcja, skutkiem tego aktywnego transakcji zależy od implementacji dostawcy „s JDBC. Zwykle sterownik JDBC automatycznie zatwierdza lub wycofuje tę transakcję. Ale w tym przypadku nie ma znaczenia, czy transakcja zostanie zatwierdzona czy wycofana, ponieważ już dostałeś żądane dane.

+0

Dzięki za szczegółową odpowiedź –