작성
·
32
0
안녕하세요.
강의 자료중에, " MemberRepository는 JPA를 통해 회원을 저장하는데, 이때 JPA는 트랜잭션이 시작된 con1을 사용해서 회원을 저장한다 " 라고 되어있는데요.
이 부분에 대해 영한님께서 "em.persist()를 호출할때 내부적으로 JPA는 트랜잭션이 시작된 con1을 사용한다" 고 하셨는데,
em.persist()를 호출할때, 실제 데이터베이스에 커밋은 아직 하지 않지만 con1을 사용해서 회원을 데이터베이스에 저장하는것인가요?
"LogRepository도 트랜잭션C와 관련된 con2를 사용한다" 라고 강의자료에 나와있는 부분도, 위 내용과 동일한걸까요?
con1과, con2를 사용한다는 개념이 어떤것을 의미하는지 궁금해서 질문드립니다.
감사합니다.
답변 2
0
0
안녕하세요, 인프런 AI 인턴입니다. 오리쉐리님.
질문해주신 내용을 기반으로, 스프링과 JPA의 트랜잭션 및 커넥션 관리에 대해 설명드리겠습니다.
em.persist()
호출과 커밋em.persist()
메서드를 호출할 때, JPA는 엔티티 매니저를 통해 해당 객체를 영속성 컨텍스트에 저장합니다. 이때 실제 데이터베이스에 커밋되는 것은 아니며, 단지 con1
을 통해 트랜잭션 내에서 변경 사항을 준비하는 것입니다. 실제 데이터베이스에 커밋되는 시점은 트랜잭션이 종료되거나 EntityManager.flush()
가 호출되었을 때입니다. 스프링에서는 @Transactional
어노테이션을 사용하면 트랜잭션이 자동으로 관리되어, 메서드가 끝날 때 커밋(혹은 롤백)이 진행됩니다.
LogRepository가 별도의 트랜잭션 C
와 관련된 con2
를 사용한다고 하신 부분은 특정 로직이 서로 다른 트랜잭션에 의해 독립적으로 처리될 때 발생합니다. 두 트랜잭션이 서로 다른 작업 단위를 가지며, 각각 별도의 커넥션을 통할 수 있습니다. 이는 특히 @Transactional
에 PROPAGATION.REQUIRES_NEW
같은 옵션을 사용할 때 유용합니다.
con1
과 con2
를 사용한다는 것은 각각의 트랜잭션이 별도의 데이터베이스 연결을 통해 독립적으로 관리된다는 것을 의미합니다. 트랜잭션 범위 내에서 동일한 커넥션이 사용되어야 일관성을 유지할 수 있으며, 커넥션이 트랜잭션의 경계를 넘게 되면 해당 커넥션에서 수행된 모든 작업의 안정성을 보장할 수 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
아 그냥 단순히 커넥션을 사용한다는것이,
해당 트랜잭션과 관련된 커넥션을 사용한다는것인가요?