django transaction 이 생각한대로 작동하질 않아 해결방안을 좀 여쭤보려고 합

 
이재용

django transaction 이 생각한대로 작동하질 않아 해결방안을 좀 여쭤보려고 합니다.

현재 django 1.10, python 3.4.3 버전 사용중입니다.

django 공식 문서(https://docs.djangoproject.com/en/1.10/topics/db/transactions/)에 따르면 @transaction.atomic 데코레이터를 붙여주는 방법도 있고 with transaction.atomic(): 블록으로 잡아주는 방법도 있는데 둘 다 의도한대로 동작하질 않네요.

테스트했던 코드는 사진으로 첨부했습니다.

한 트랜잭션 안에서 우선 update episode set volume = 12 where id = 1; 이 실행된 뒤에 raise Exception 을 만났으니 위의 쿼리가 롤백이 되어야 할텐데 그대로 디비에 반영이 되네요.

혹시 몰라 setting에서 ATOMIC_REQUESTS = True도 주고 해봤는데 여전히 예상대로 동작하지 않습니다.

데이터베이스는 mysql에 InnoDB 엔진 사용중입니다.


  • 남홍김

    문서에 Avoid catching exceptions inside atomic! 노트 부분을 보시면 도움이 될 거 같습니다.

    Kyeong-Mook Kay Cha

    transaction.atomic()은 데이터베이스 관련 예외에 대해서만 except 처리합니다.

    https://goo.gl/kr2NxW
    https://goo.gl/6wPE5B
    https://goo.gl/0DNxrw

    이재용

    아, 원인을 찾았습니다. DATABASE_ROUTER 설정을 이용해서 multi-db 를 사용하고 있었는데, @transaction.atomic 설정시에 (using=’db alias’) 같이 라우팅되는 데이터베이스 알리아스를 지정해줘야 되는군요.

    이재용

    답글 달아주신 분들 전부 감사합니다.

Advertisements