강의

멘토링

커뮤니티

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

kyo lee님의 프로필 이미지
kyo lee

작성한 질문수

[매일 완독 챌린지] 저자와 함께하는 <FastAPI로 기획에서 출시까지>

6장 : pytest 픽스쳐로 의존성 주입하기 (p190~p200)

commit과 flush 관련

작성

·

27

0

질문이 조금 많아서 죄송합니다. 다음 테스트 코드에서 commit()과 flush()의 위치가 이상해보였습니다.

async def test_user_detail_for_real_user(client: TestClient, db_session: AsyncSession):
    user = User(
        username="test",
        password="test",
        email="test@example.com",
        display_name="test",
        is_host=True,
    )
    db_session.add(user)
    await db_session.commit()
    await db_session.flush()


commit()은 DB에 반영된 트랜잭션의 변경사항을 영속적으로 만들고 트랜잭션을 종료하는 코드로 이해하고 있고, flush()는 트랜잭션의 변경사항을 실제 DB에 SQL 구문을 통해 반영하는 것으로 알고 있습니다. 그래서 이 둘의 순서가 변경된 것이 아닌지 혹은 다른 의도가 있는 것인지 궁금합니다.

답변 2

1

한날님의 프로필 이미지
한날
지식공유자

앗, 으아아. 말씀하신 게 맞습니다. flush() 가 먼저 호출되는 게 맞습니다.

제가 처음에 잘못 작성한 후 코드를 붙여넣다보니 실습 코드에 전부 flush가 나중에 호출되어 있네요.

kyo lee님의 프로필 이미지
kyo lee
질문자

아하. 감사합니다!

0

안녕하세요, 인프런 AI 인턴입니다. kyo lee님.

질문해주신 commit()flush()의 사용 방식 및 순서에 대해 설명드리겠습니다. commit()flush()는 각각 데이터베이스 트랜잭션 관리의 핵심 역할을 수행합니다.

  • commit(): 데이터베이스 트랜잭션의 최종 완료를 의미하며, 변경 사항을 영구적으로 저장하고 트랜잭션을 종료합니다. 일반적으로 모든 작업이 완료되고, 오류가 없는 경우 호출됩니다.

  • flush(): 세션에 있는 모든 작업의 변경 내용을 데이터베이스에 실제 반영하지만 트랜잭션을 커밋하지는 않습니다. 이는 대개 트랜잭션 내에서 SQL 명령어를 실행하고 즉시 사용할 수 있는 상태로 만들기 위해 사용됩니다.

그렇다면 flush()commit() 후에 사용한 것에 대한 의문점이 생길 수 있는데, 일반적으로는 flush()commit() 전에 사용하여 세션의 변경사항을 DB에 적용한 다음, commit()으로 트랜잭션을 확정하는 방식이 맞습니다. 코드의 의도가 잘못된 순서를 가지고 있는 것 같으니, 작성하신 코드를 검토하시고 필요하다면 순서를 조정하는 것이 맞습니다.

기존 질문 답변을 참고하여 더 자세한 설명과 해결 방법을 얻고 싶으실 때는 아래 링크를 참조해 보세요:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

kyo lee님의 프로필 이미지
kyo lee

작성한 질문수

질문하기