인프런 커뮤니티 질문&답변
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가 나중에 호출되어 있네요.
0
안녕하세요, 인프런 AI 인턴입니다. kyo lee님.
질문해주신 commit()과 flush()의 사용 방식 및 순서에 대해 설명드리겠습니다. commit()과 flush()는 각각 데이터베이스 트랜잭션 관리의 핵심 역할을 수행합니다.
commit(): 데이터베이스 트랜잭션의 최종 완료를 의미하며, 변경 사항을 영구적으로 저장하고 트랜잭션을 종료합니다. 일반적으로 모든 작업이 완료되고, 오류가 없는 경우 호출됩니다.flush(): 세션에 있는 모든 작업의 변경 내용을 데이터베이스에 실제 반영하지만 트랜잭션을 커밋하지는 않습니다. 이는 대개 트랜잭션 내에서 SQL 명령어를 실행하고 즉시 사용할 수 있는 상태로 만들기 위해 사용됩니다.
그렇다면 flush()를 commit() 후에 사용한 것에 대한 의문점이 생길 수 있는데, 일반적으로는 flush()를 commit() 전에 사용하여 세션의 변경사항을 DB에 적용한 다음, commit()으로 트랜잭션을 확정하는 방식이 맞습니다. 코드의 의도가 잘못된 순서를 가지고 있는 것 같으니, 작성하신 코드를 검토하시고 필요하다면 순서를 조정하는 것이 맞습니다.
기존 질문 답변을 참고하여 더 자세한 설명과 해결 방법을 얻고 싶으실 때는 아래 링크를 참조해 보세요:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.





아하. 감사합니다!