इस प्रकार के स्थायित्वएक कनेक्शन के साथ ACID के कारण असंभव है। (यानी कि एक घोंसला वाला ब्लॉक तब भी रहता है जब बाहरी ब्लॉक वापस घुमाया जाता है) यह एसीआईडी का परिणाम है, न कि Django की समस्या। एक सुपर डेटाबेस की कल्पना करें और स्थिति B
तालिका A
तालिका के लिए एक विदेशी कुंजी है।
CREATE TABLE A (id serial primary key);
CREATE TABLE B (id serial primary key, b_id integer references A (id));
-- transaction
INSERT INTO A DEFAULT VALUES RETURNING id AS new_a_id
-- like it would be possible to create an inner transaction
INSERT INTO B (a_id) VALUES (new_a_id)
-- commit
-- rollback (= integrity problem)
तो भीतरी "लेन-देन" टिकाऊ होना चाहिए, जबकि (बाह्य) लेन-देन वापस लुढ़का हो तो अखंडता टूट किया जाएगा। रोलबैक ऑपरेशन हमेशा लागू किया जाना चाहिए ताकि यह कभी विफल न हो, इसलिए कोई डेटाबेस घोंसला वाले स्वतंत्र लेनदेन को लागू नहीं करेगा। यह कारणता के सिद्धांत के खिलाफ होगा और इस तरह के चुनिंदा रोलबैक के बाद अखंडता की गारंटी नहीं दी जा सकती है। यह परमाणु के खिलाफ भी है।
लेनदेन डेटाबेस कनेक्शन से संबंधित है। यदि आप दो कनेक्शन बनाते हैं तो दो स्वतंत्र लेनदेन बनाए जाते हैं। एक कनेक्शन में अन्य लेनदेन की असामान्य पंक्तियां नहीं दिखती हैं (यह अलगाव स्तर सेट करना संभव है, लेकिन यह डेटाबेस बैकएंड पर निर्भर करता है) और उनके लिए कोई विदेशी कुंजी नहीं बनाई जा सकती है और डेटाबेस द्वारा रोलबैक के बाद अखंडता संरक्षित होती है बैकएंड डिजाइन।
Django एकाधिक डेटाबेस का समर्थन करता है, इसलिए एकाधिक कनेक्शन।
# no ATOMIC_REQUESTS should be set for "other_db" in DATABASES
@transaction.atomic # atomic for the database "default"
def my_view():
with atomic(): # or set atomic() here, for the database "default"
some_code()
with atomic("other_db"):
row = OtherModel.objects.using("other_db").create(**kwargs)
raise DatabaseError
"other_db" में डेटा प्रतिबद्ध रहता है।
Django में संभवतः एक ही डेटाबेस के लिए दो कनेक्शन के साथ एक चाल बनाने के लिए संभव है जैसे कि कुछ डेटाबेस बैकएंड के साथ दो डेटाबेस होंगे, लेकिन मुझे यकीन है कि यह अनचाहे है, यह गलतियों से ग्रस्त होगा, माइग्रेशन के साथ समस्याओं के साथ, डेटाबेस बैकएंड द्वारा बड़ा भार जो हर अनुरोध पर वास्तविक समांतर लेनदेन बनाना चाहिए और इसे अनुकूलित नहीं किया जा सकता है। दो वास्तविक डेटाबेस का उपयोग करना या कोड को पुनर्गठित करना बेहतर है।
सेटिंग DATABASE_ROUTERS बहुत उपयोगी है, लेकिन मुझे अभी तक यकीन नहीं है कि यदि आप एकाधिक कनेक्शन में रूचि रखते हैं।
मुझे आपके पाठ में मेरे प्रश्न का उत्तर नहीं मिला। आप कहते हैं कि मुझे यह सुनिश्चित करने की ज़रूरत है कि बाहरी परमाणु ब्लॉक प्रतिबद्ध हो। हाँ यह सच है। Django में यह कैसे करें? – guettli
@guettli मैंने अपना जवाब अपडेट किया। ऐसा करने के लिए कोई एपीआई नहीं है, इसे प्राप्त करने का एकमात्र तरीका यह सुनिश्चित करना है कि लेनदेन में कोड किसी भी त्रुटि के बिना खत्म हो जाए। – knbk
@guettli, यदि आप django में निम्न स्तर के लेनदेन प्रबंधन करना चाहते हैं, तो आप सीधे 'लेनदेन' पैकेज का उपयोग कर सकते हैं। उदाहरण के लिए, आप https://github.com/2ps/djenga/blob/master/djenga/db/nested_transactions.py देख सकते हैं, जो कुछ मैंने लिखा था जब django mysql में नेस्टेड लेनदेन का समर्थन नहीं करता था। – 2ps