인프런 커뮤니티 질문&답변

gdf4013님의 프로필 이미지
gdf4013

작성한 질문수

자바 ORM 표준 JPA 프로그래밍 - 기본편

트랜잭션 커밋시 영속 컨텍스트, 그리고 트랜잭션 커밋과 종료의 차이

작성

·

419

·

수정됨

0

트랜잭션이 커밋이 일어나면 영속 컨텍스트가 어떻게 되는지 궁금해서 질문드립니다.

 

비슷한 질문이 있어 해당 글의 답을 보니, "커밋되는 시점에는 영속성 컨텍스트를 삭제한다."라고 되어있습니다.

그런데 어떤 블로그 글에서는 커밋되더라도 영속 컨텍스트의 1차 캐시는 남아있고, 쓰기 지연 SQL 저장소의 내용은 사라진다고 되어있습니다.

Q1. 정확히 어떻게 되나요? 그리고 "컨텍스트의 삭제"의 정확한 의미가 이해가 되지않아서 이 부분도 궁금합니다!

Q2. 영속 컨텍스트 자체가 삭제되는거라면, 커밋될 때 영속 컨텍스트의 삭제와 엔티티 매니저를 close()할 때 영속 컨텍스트가 닫히는것의 차이가 무엇인지 궁금합니다!

Q3. 그리고 트랜잭션 커밋과 종료의 차이가 무엇인지 궁금합니다.

찾아보니 "COMMIT을 수행하면 하나의 트랜잭션 과정을 종료하는 것이다"라고 봤는데, 워딩의 차이이지 결국 같은 의미인가요? 아니면 커밋하지않고 트랜잭션이 종료될 수 도 있는건가요?

감사합니다.

답변 1

0

안녕하세요. gdf4013님, 공식 서포터즈 y2gcoder입니다.

Q1. 정확히 어떻게 되나요? 그리고 "컨텍스트의 삭제"의 정확한 의미가 이해가 되지않아서 이 부분도 궁금합니다! (트랜잭션 커밋시 영속성 컨텍스트의 동작)

=> 정확하게는 트랜잭션 커밋 시점에 영속성 컨텍스트는 닫히게(비활성화) 된다고 이해하시는 게 맞는 것 같습니다. 트랜잭션 커밋 시 Dirty Checking을 통해 변경된 엔티티 상태를 데이터베이스에 반영하면서 쓰기 지연 SQL 저장소를 비우고, 트랜잭션 범위를 벗어나면 해당 영속성 컨텍스트는 비활성화되었다가, 동일한 스레드에서 새로운 트랜잭션을 열면 새로운 영속성 컨텍스트가 활성화됩니다. 이전 영속성 컨텍스트가 비활성화되는 것을 삭제로 볼 수도 있을 것 같습니다!

 

Q2. 영속 컨텍스트 자체가 삭제되는거라면, 커밋될 때 영속 컨텍스트의 삭제와 엔티티 매니저를 close()할 때 영속 컨텍스트가 닫히는것의 차이가 무엇인지 궁금합니다!

=> 삭제에 대해서는 위에서 답변해드린 것을 참고해주시면 감사하겠습니다. EntityManager를 close()한다면 해당 영속성 컨텍스트는 완전히 종료되게 됩니다. 그리고 그 안에서 영속 상태이던 엔티티들은 준영속 상태가 됩니다. 그런 의미에서 트랜잭션 커밋 후 트랜잭션 범위를 벗어났을 때와 엔티티 매니저를 close()했을 때는 동일한 의미라고 저는 이해하고 있습니다.

Q3. 그리고 트랜잭션 커밋과 종료의 차이가 무엇인지 궁금합니다.

=> 트랜잭션 종료가 좀 더 큰 의미라고 생각합니다. 트랜잭션 커밋이 트랜잭션 내 수행된 모든 작업들이 데이터베이스에 성공적으로 반영되었다는 것을 의미한다면, 그 반대로 트랜잭션 내 수행하던 작업 중 문제가 생겨 롤백하면서 트랜잭션이 종료되는 경우도 있습니다 :) 저는 그래서 트랜잭션의 성공적인 종료를 커밋, 실패한 종료를 롤백으로 이해하고 있습니다!

 

감사합니다.

gdf4013님의 프로필 이미지
gdf4013

작성한 질문수

질문하기