वास्तव में नेस्टेड लेनदेन . ऐसा ही होता है के लिए डिजाइन किया गया था। मैं ओरेकल डॉक्स से उद्धृत करता हूं:
तो, एक नियमित नेस्टेड लेन-देन . में एक चाइल्ड लेन-देन उसे या अन्य बच्चों या माता-पिता (बड़ा लेन-देन . के बारे में कोई बात नहीं है ) आपसी डेटा बदलने या अपवाद के लिए विफल होने के अलावा अन्य व्यवहार कर सकता है।
लेकिन आप उसे अनुदान दे सकते हैं (बाल लेन-देन ) sub-transaction
. का उपयोग करके अपने भाग्य पर मतदान का एक बहुत ही सीमित मौका रेल में बताई गई सुविधा docs
requires_new: true
. पास करके
User.transaction do
User.create(username: 'Kotori')
User.transaction(requires_new: true) do
User.create(username: 'Nemu')
raise ActiveRecord::Rollback
end
end
जैसा कि डॉक्स कहते हैं:केवल 'कोटरी' बनाता है। चूंकि शक्तिशाली 'नेमू' बच्चे ने चुपचाप मरने का फैसला किया।
नेस्टेड लेनदेन नियमों . के बारे में अधिक विवरण (ओरेकल डॉक्स )
अपडेट करें:
बेहतर ढंग से समझने के लिए क्यों रेल nested transactions
इस तरह से काम करता है, आपको डीबी स्तर में नेस्टेड लेनदेन कैसे काम करता है, इसके बारे में आपको कुछ और जानने की जरूरत है, मैं रेल एपीआई डॉक्स
:
ठीक है, फिर डॉक्स nested transaction
. के व्यवहार का वर्णन करते हैं दो उल्लिखित मामलों में निम्नानुसार है:
नेस्टेड कॉल के मामले में, #transaction इस प्रकार व्यवहार करेगा:
-
बिना कुछ किए ही ब्लॉक चलाया जाएगा। ब्लॉक के भीतर होने वाले सभी डेटाबेस स्टेटमेंट पहले से ही खुले डेटाबेस लेनदेन में प्रभावी रूप से जुड़ जाते हैं।
-
हालांकि, अगर :require_new सेट किया गया है, तो ब्लॉक एक डेटाबेस सेवपॉइंट में लपेटा जाएगा जो उप-लेनदेन के रूप में कार्य करेगा।
मैं कल्पना करता हूं सावधान, केवल कल्पना करें वह:
विकल्प(1) (बिना आवश्यकता_नया) क्या आपने एक ऐसे DBMS का उपयोग किया है जो nested transactions
का पूरी तरह से समर्थन करता है या आप nested_attributes
. के "नकली" व्यवहार से खुश हैं
जबकि विकल्प(2) savepoint
. का समर्थन करना है यदि आप नहीं करते हैं तो समाधान।