Unterschied zwischen save und saveAndFlush in Spring data jpa

131

Ich versuche, Spring Data JPA zu lernen, indem ich einige CRUD-Operationen über teste JpaRepository.

Ich bin auf zwei Methoden gestoßen saveund saveAndFlush. Ich verstehe den Unterschied zwischen diesen beiden nicht. Beim Aufruf werden saveauch meine Änderungen in der Datenbank gespeichert, also wozu dient saveAndFlush.

Anand
quelle

Antworten:

139

Ein saveAndFlush, Änderungen werden in diesem Befehl sofort in die Datenbank übertragen. Mit save, ist dies nicht unbedingt der Fall, und könnte nur in Erinnerung bleiben, bis flushoder commitBefehle ausgegeben werden.

Aber beachten Sie , dass selbst wenn Sie die Änderungen in der Transaktion spülen und sie nicht begehen, noch die Änderungen nicht auf die Außen Transaktionen sichtbar sein , bis die in dieser Transaktion zu begehen.

In Ihrem Fall verwenden Sie wahrscheinlich einen Transaktionsmechanismus, der einen commitBefehl für Sie ausgibt , wenn alles gut funktioniert.

user1918305
quelle
35
"wird für externe Transaktionen erst nach dem Festschreiben in dieser Transaktion sichtbar sein" Dies hängt von der Isolationsstufe der anderen Transaktionen ab. Wenn die Isolationsstufe einer Transaktion READ_UNCOMMITTED , ist, wird angezeigt, was gelöscht, aber noch nicht von anderen Transaktionen festgeschrieben wurde.
Gab
1
In meinem Projekt verwende ich jedoch save (), saveAll () und es bleibt in der Datenbank bestehen, ohne dass explizit ein Commit- oder Flush-Aufruf erfolgt. Warum sollte ich dann saveAndFlush bevorzugen? FLush-Modus all diese Dinge sind im Standardmodus
P Satish Patro
37

Abhängig vom verwendeten Ruhezustand-Spülmodus ( AUTOStandardeinstellung) werden saveIhre Änderungen möglicherweise sofort in die Datenbank geschrieben oder nicht. Wenn Sie anrufen saveAndFlush, erzwingen Sie die Synchronisation Ihres Modellstatus mit der Datenbank.

Wenn Sie den Flush-Modus AUTO verwenden und Ihre Anwendung verwenden, um die Daten zuerst zu speichern und dann erneut auszuwählen, sehen Sie keinen Unterschied im Verhalten zwischen save()und, saveAndFlush()da die Auswahl zuerst einen Flush auslöst. Siehe die Dokumentation .

Ralf
quelle
Entschuldigung, aber wenn ich saveeine Entität und wieder dieselbe bin , meinst du, mit savedem zweiten Befehl wird zum Beispiel keine Ausnahme für die Duplizierung ausgelöst?
Azerafati
3
@Bludream Ja, nach meinem Verständnis sind Anrufe an saveidempotent. Weitere Informationen finden Sie in diesem Thread .
Ralf