Różnica między save i saveAndFlush w Spring data jpa

133

Próbuję nauczyć się JPA danych wiosennych, testując jakąś operację CRUD za pośrednictwem JpaRepository.

Natknąłem się na dwie metody savei saveAndFlush. Nie rozumiem różnicy między tymi dwoma. Podczas wywoływania saverównież moje zmiany są zapisywane w bazie danych, więc po co saveAndFlush.

Anand
źródło

Odpowiedzi:

139

Włączone saveAndFlush, zmiany zostaną natychmiast przeniesione do DB w tym poleceniu. Z saveta niekoniecznie jest prawdą, a może pozostać tylko w pamięci, aż flushlub commitpolecenia są wydawane.

Należy jednak pamiętać, że nawet jeśli opróżnisz zmiany w transakcji i ich nie zatwierdzisz, zmiany nadal nie będą widoczne dla transakcji zewnętrznych do momentu zatwierdzenia w tej transakcji.

W twoim przypadku prawdopodobnie używasz jakiegoś mechanizmu transakcyjnego, który wydaje ci commitpolecenie, jeśli wszystko działa dobrze.

user1918305
źródło
35
„nie będzie widoczny dla transakcji zewnętrznych, dopóki nie zostanie zatwierdzony w tej transakcji”. Zależy to od poziomu izolacji innych transakcji. Jeśli poziom izolacji transakcji to READ_UNCOMMITTED ,, wówczas zobaczy, co zostało opróżnione, ale nie zostało jeszcze zatwierdzone przez inne transakcje.
Gab 是 好人
1
ale w moim projekcie używam save (), saveAll () i utrzymuje się to w DB bez jawnego wywołania commit lub flush. W takim razie dlaczego powinienem preferować saveAndFlush? Tryb FLush wszystkie te rzeczy są w trybie domyślnym
P Satish Patro
P Satish Patro, saveAndFlush () służy do natychmiastowego spłukiwania. Jeśli użyjesz save (), operacja opróżnienia zostanie później obsłużona przez JPA.
kwiecień
38

W zależności od trybu hibernacji, którego używasz ( AUTOjest to ustawienie domyślne), savemożesz zapisać zmiany w bazie danych od razu lub nie. Kiedy dzwonisz saveAndFlush, wymuszasz synchronizację stanu modelu z bazą danych.

Jeśli używasz trybu płukania AUTO i używasz aplikacji do najpierw zapisania, a następnie ponownego wybrania danych, nie zobaczysz różnicy w sposobie działania między save()i, saveAndFlush()ponieważ opcja wyboru najpierw wyzwala rzut. Zobacz dokumentację .

Ralf
źródło
przepraszam, ale jeśli jestem savebytem i znowu tym samym, masz na myśli, że z savedrugim poleceniem nie rzucisz wyjątku na przykład do duplikacji?
azerafati
3
@Bludream Tak, rozumiem, że wywołania savesą idempotentne. Zobacz ten wątek, aby uzyskać więcej informacji.
Ralf,