खोज…


परमाणु लेनदेन

मुसीबत

डिफ़ॉल्ट रूप से, 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