장고 ORM Transaction 써보기
여러 테이블에 걸쳐서 동시에 수행이 딱딱 같이 되어야 하는 몇개의 일련적인 동작의 일치성을 위해 transaction 기능을 써보도록 하자! 관련하여 아주 좋은 블로그 글 링크가 있어서 일단 소개합니다.
다른건 몰라도, 사용법은 간단하게 아래와 같이 구성했다.
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() 바깥으로 해야 한다고 강력히 권고된다. 주의하세요. 😊