Spring 데이터 JPA에서 save와 saveAndFlush의 차이점


131

통해 CRUD 작업을 테스트하여 스프링 데이터 JPA를 배우려고합니다 JpaRepository.

나는 두 가지 방법 save을 발견했다 saveAndFlush. 나는이 둘의 차이를 얻지 못한다. 호출 할 때 save내 변경 사항이 데이터베이스에 저장되어 있으므로 무엇을 사용하고 있습니까 saveAndFlush?

답변:


139

설정 saveAndFlush하면이 명령에서 변경 사항이 즉시 DB로 플러시됩니다. 로 save, 이것은 반드시 사실이 아니다, 그냥 메모리에 남아 있습니다, 때까지 flush또는 commit명령이 발급됩니다.

그러나 트랜잭션에서 변경 사항을 플러시하고 커밋하지 않더라도이 트랜잭션에서 커밋 될 때까지 변경 사항 은 외부 트랜잭션에 계속 표시 되지 않습니다 .

귀하의 경우에는 모든 종류의 트랜잭션 메커니즘을 사용하여 commit모든 것이 잘 작동하면 명령을 발행 합니다.


35
"이 트랜잭션에서 커밋 될 때까지 외부 트랜잭션에 표시되지 않습니다" 다른 트랜잭션의 격리 수준에 따라 다릅니다. 트랜잭션의 격리 수준이 READ_UNCOMMITTED이면 플러시되었지만 아직 다른 트랜잭션에 의해 커밋되지 않은 항목을 볼 수 있습니다.
Gab 是 好人

1
그러나 내 프로젝트에서는 save (), saveAll ()을 사용하며 명시 적으로 커밋 또는 플러시 호출없이 DB에 유지됩니다. 그렇다면 왜 saveAndFlush를 선호해야합니까? FLush 모드 모든 것들이 기본 모드에 있습니다
P Satish Patro

37

사용중인 최대 절전 모드 ( AUTO기본값)에 save따라 변경 사항을 DB에 바로 쓰거나 쓰지 않을 수 있습니다. 전화 saveAndFlush하면 모델 상태를 DB와 동기화해야합니다.

당신이 플러시 모드 AUTO를 사용하고 데이터를 다시 선택한 다음 저장 첫번째로 응용 프로그램을 사용하는 경우, 당신은 사이 bahvior의 차이를 볼 수 없습니다 save()saveAndFlush()플러시 먼저 선택 트리거 때문이다. 문서를 참조하십시오 .


죄송하지만 save엔티티이고 다시 동일한 엔티티 인 경우 save두 번째 명령을 사용하면 예를 들어 복제에 대한 예외가 발생하지 않습니다.
azerafati

3
@Bludream 네, 전화가 dem 등하다는 것은 제 이해입니다 save. 자세한 내용은이 스레드 를 참조하십시오.
Ralf
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.