수색…


원자 트랜잭션

문제

기본적으로 Django는 즉시 데이터베이스 변경을 커밋합니다. 일련의 커밋 중에 예외가 발생하면 데이터베이스가 원치 않는 상태가 될 수 있습니다.

def create_category(name, products):
    category = Category.objects.create(name=name)
    product_api.add_products_to_category(category, products)
    activate_category(category)

다음 시나리오에서 :

>>> create_category('clothing', ['shirt', 'trousers', 'tie'])
---------------------------------------------------------------------------
ValueError: Product 'trousers' already exists

의류 카테고리에 바지 제품을 추가하는 동안 예외가 발생합니다. 이 시점까지 카테고리 자체가 이미 추가되었으며 셔츠 제품이 추가되었습니다.

코드를 수정하고 create_category() 메서드를 다시 호출하기 전에 불완전한 카테고리와 포함 된 제품을 수동으로 제거해야합니다. 그렇지 않으면 중복 카테고리가 만들어집니다.


해결책

django.db.transaction 모듈을 사용하면 여러 데이터베이스 변경 사항을 원자 트랜잭션 으로 결합 할 수 있습니다.

[모두] 또는 아무 것도 발생하지 않는 일련의 데이터베이스 작업.

위의 시나리오에 적용하면 데코레이터 로 적용 할 수 있습니다.

from django.db import transaction

@transaction.atomic
def create_category(name, products):
    category = Category.objects.create(name=name)
    product_api.add_products_to_category(category, products)
    activate_category(category)

또는 컨텍스트 관리자 를 사용하여 :

def create_category(name, products):
    with transaction.atomic():
        category = Category.objects.create(name=name)
        product_api.add_products_to_category(category, products)
        activate_category(category)

이제 트랜잭션 내의 모든 단계에서 예외가 발생하면 데이터베이스 변경이 커밋되지 않습니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow