Django
데이터베이스 트랜잭션
수색…
원자 트랜잭션
문제
기본적으로 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