Django 1.6 और घोंसला "लेनदेन के साथ .atomic ()"

I've got used through the years to the older transaction.commit_on_success and transaction.commit_manually with Django < 1.6. But now with Django 1.6 the old API is replaced mainly with transaction.atomic.

After reading the docs on the new API, I'm still not sure how the following code will be committed to the database:

def a_first_function():
    with transaction.atomic():
        a_second_function_successful()
        a_third_function_fails()

def a_second_function_successful():
    with transaction.atomic():
        do_something()

def a_third_function_fails():
    do_something_wrong()

इस उदाहरण में, आइए मान लें कि a_second_function_sfulful a_first_function से बुलाया जाता है और मॉडल से वस्तुओं को बनाता/सहेजता है। इस दूसरे_फंक्शन के सफल होने के तुरंत बाद, तीसरा फ़ंक्शन बुलाया जाता है और विफल रहता है।

यह देखते हुए कि संदर्भ प्रबंधक का उपयोग कर लेनदेन। सैटिक दोनों पहले और दूसरे फ़ंक्शन में उपयोग किया जाता है, a_second_function_successful में बनाए गए/संशोधित डेटा के साथ क्या होगा। क्या यह डेटाबेस के लिए प्रतिबद्ध होगा? क्या इसे पहले फंक्शन से स्वचालित रूप से वापस ले जाया जाएगा? मेरा अनुभव यह है कि यह दूसरा कार्य ध्यान दिए बिना किया जाएगा, हालांकि, मुझे उम्मीद है कि यह प्रतिबद्ध नहीं होगा।

यदि तीसरे कार्य को निम्नलिखित के रूप में परिभाषित किया गया तो क्या इससे कोई फर्क पड़ता है:

@transaction.atomic
def a_third_function_fails():
    do_something_wrong()

या जैसा:

def a_third_function_fails():
    with transaction.atomic():
        do_something_wrong()

धन्यवाद,

0

1 उत्तर

Well I would say if you don't have any try except blocks to catch the exceptions triggering the rollback than everything will be rolled back, as the exception will propagate to the topmost with transaction.atomic() from a_first_function(), even if it is raised from a_third_function_fails()

हालांकि यदि आप a_third_function_fails में अपवाद को पकड़ना चाहते हैं, जिसका अर्थ है कि आपको कुछ ऐसा करना होगा:

def a_third_function_fails():
    try:
        with transaction.atomic():
            do_something_wrong()
    except:
        pass

फिर आपके पास तीसरा फ़ंक्शन रोल होगा और दूसरा फ़ंक्शन नहीं होगा क्योंकि जब आप a_third_function_fails से trans.tomic() को कॉल करते हैं तो आप निश्चित रूप से एक सेवपॉइंट बना रहे हैं।

0
जोड़ा