>

트랜잭션 내에서 여러 번의 대량 생성 (독립)을하고 싶습니다.

           with transaction.atomic():
                if x:
                   X.objects.bulk_create(x_objs)
                if y:
                    Y.objects.bulk_create(y_objs)
                if z:
                    Z.objects.bulk_create(z_objs)


이제 Y 또는 Z가 실패하면 X가 롤백되기를 원합니다. 어떻게해야합니까?

  • 답변 # 1

    정상적으로 transaction.atomic() 내부에서 예외가 발생하면 트랜잭션이 이미 롤백되어야합니다.  차단합니다.

    보다 복잡한 사용 사례를 위해 롤백해야하는 경우 수동으로 수행 할 수 있습니다.

           with transaction.atomic():
                if x:
                   X.objects.bulk_create(x_objs)
                try:
                    if y:
                        Y.objects.bulk_create(y_objs)
                    if z:
                        Z.objects.bulk_create(z_objs)
                except Exception: # Your exception
                    transaction.rollback()
    
    

    하지만 일반적으로 atomic() 에서 예외를 직접 잡아서는 안됩니다.  차단하면 의도 한대로 작동하지 않습니다.

    와이즈 비즈

    When exiting an atomic block, Django looks at whether it’s exited normally or with an exception to determine whether to commit or roll back. If you catch and handle exceptions inside an atomic block, you may hide from Django the fact that a problem has happened. This can result in unexpected behavior.

관련 자료

  • 이전 mailcore - iOS 8에서 MailCore2를 사용하여 Attchaments 보내기
  • 다음 Java에서 클래스의 모든 하위 클래스를 얻는 방법은 무엇입니까?