Разница между save и saveAndFlush в данных Spring jpa

131

Я пытаюсь изучить JPA данных Spring, тестируя некоторые операции CRUD через JpaRepository.

Я столкнулся с двумя способами saveи saveAndFlush. Я не понимаю разницы между этими двумя. При вызове saveтакже мои изменения сохраняются в базе данных, так что в чем польза saveAndFlush.

Ананд
источник

Ответы:

139

Вкл. saveAndFlush, В этой команде изменения будут немедленно сброшены в БД. With save, это не обязательно верно и может оставаться только в памяти, пока не будут введены команды flushили commit.

Но имейте в виду, что даже если вы сбрасываете изменения в транзакции и не фиксируете их, изменения все равно не будут видны внешним транзакциям до фиксации в этой транзакции.

В вашем случае вы, вероятно, используете какой-то механизм транзакций, который выдает commitвам команду, если все работает нормально.

user1918305
источник
35
«не будет видимым для внешних транзакций до тех пор, пока не будет зафиксирована эта транзакция». Это зависит от уровня изоляции других транзакций. Если уровень изоляции транзакции READ_UNCOMMITTED ,, тогда он увидит, что было сброшено, но еще не зафиксировано другими транзакциями.
Gab 是 好人
1
но в моем проекте я использую save (), saveAll (), и он сохраняется в БД без явного вызова фиксации или сброса. Тогда почему я должен предпочесть saveAndFlush? Режим FLush - все эти вещи в режиме по умолчанию
P Satish Patro
37

В зависимости от того, какой режим спящего режима вы используете ( AUTOпо умолчанию), вы saveможете сразу или не записать ваши изменения в БД. Когда вы звоните, saveAndFlushвы обеспечиваете синхронизацию состояния вашей модели с БД.

Если вы используете режим очистки AUTO, и вы используете свое приложение, чтобы сначала сохранить, а затем снова выбрать данные, вы не увидите разницы в bahvior между save()и, saveAndFlush()потому что выбор сначала запускает сброс. См. Документацию .

Ralf
источник
извините, но если я saveявляюсь сущностью и снова такой же, вы имеете в виду, saveчто вторая команда не будет генерировать исключение для дублирования, например ??
azerafati 05
3
@Bludream Да, я так понимаю, что призывы к saveидемпотентны. Смотрите эту ветку для более подробной информации.
Ralf