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:
Database zazwyczaj rozpocząć nową transakcję automatycznie gdy prąd SQL instrukcja wymaga jednej, a żadna transakcja nie jest jawnie rozpoczęta wcześniej.
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.
Dzięki za szczegółową odpowiedź –