장고 ORM Transaction 써보기

목록으로 돌아가기

여러 테이블에 걸쳐서 동시에 수행이 딱딱 같이 되어야 하는 몇개의 일련적인 동작의 일치성을 위해 transaction 기능을 써보도록 하자! 관련하여 아주 좋은 블로그 글 링크가 있어서 일단 소개합니다.

[
Django DB Transaction 1편 – Request와 DB Transaction 묶기(Feat. ATOMIC_REQUESTS)
Introduction – Django DB Transaction 안녕하세요. 새해에는 Django와 관련된 글들을 많이 다뤄 보려고 합니다. 첫 번째로 Django에서 DB Transaction을 다루는 방법에 대해서 공부하고 글을 써보려고 합니다…
![](https://img1.daumcdn.net/thumb/R800x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLs1ve%2FbtrppzLGG50%2FVgJFeuxrQQzuKmwCTakvk0%2Fimg.png)
](https://blog.doosikbae.com/entry/Django-Transaction%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98-1%ED%8E%B8-Request%EC%99%80-DB-Transaction-%EB%AC%B6%EA%B8%B0Feat-ATOMICREQUESTS?category=691533)

다른건 몰라도, 사용법은 간단하게 아래와 같이 구성했다.

with transaction.atomic() 이 구문이 전부이다.

    try:        with transaction.atomic():            query1            query2            query3 ...    except Exception as e:        print("re", str(e))        return 400, make_message_response(400, str(e))

쿼리들 사이에 오류가 발생하거나 사용자 에러가 발생하면 그냥 단순하게 raise Exception("에러메시지")

이렇게 하면 이미 수행된 쿼리들의 결과를 다시 롤백해주는 효과를 가져다 준다.

위의 블로그에서 소개한데로 request 별로 아예 ATOMIC 을 잡아주는 옵션이 있지만 자기가 원하는 대로 설계하는 것이 좋지 않나 싶다… 암튼 굿럭~

많은 곳에서 언급되지만, try except 는 with transaction.atomic() 바깥으로 해야 한다고 강력히 권고된다. 주의하세요. 😊

author-profile
Written by bj