2008-09-23 9 views
6

क्या यह मामला है कि पूरी तरह से शेष क्रिया एक समेकित लेनदेन के तहत है? ऐसा कहने के लिए, यदि मैं अद्यतन, हटा या ऑपरेशन को संभालने में किसी भी बिंदु पर सत्यापन या कॉलबैक में कोई त्रुटि उत्पन्न करता हूं, तो क्या प्रत्येक डेटाबेस ऑपरेशन जिसे मैंने पिछले कॉलबैक में किया हो, वापस भी लुढ़का हुआ है? संक्षेप में, किसी भी कॉलबैक या सत्यापन पर त्रुटि उठाने से ऐसा लगता है कि उस क्रिया क्रिया के लिए डेटाबेस में कोई भी परिवर्तन नहीं होता है?जब लेन-देन (आराम से) रेलों का उपयोग करते समय लेनदेन शुरू होते हैं

उत्तर

3

क्या यह मामला है कि पूरी शांतिपूर्ण क्रिया एक ही समेकित लेनदेन के तहत है?

नहीं

अगर मैं एक अद्यतन की हैंडलिंग में किसी भी बिंदु पर मान्यता या कॉलबैक में एक त्रुटि बढ़ा, हटाने या आपरेशन बनाएँ, हर डेटाबेस कार्रवाई है कि मैं पिछले में प्रदर्शन किया है हो सकता है कॉलबैक भी वापस लुढ़का?

सं

किसी भी कॉलबैक या सत्यापन कर पर एक त्रुटि की परवरिश करता है यह इस तरह है कि सभी में कोई परिवर्तन यह है कि क्रिया कार्रवाई के लिए डेटाबेस में होता है?

सं

आप या तो आप स्पष्ट रूप से अपने नियंत्रक में लेनदेन बना सकते हैं इस व्यवहार की इच्छा है (दूसरे उपयोगकर्ताओं द्वारा प्रदान उदाहरण देखें), या एक around_filter का उपयोग अपने सभी शोकहारा कार्यों के व्यवहार संलग्न करने के लिए।

1

कुछ विधियां (बनाएं, नष्ट करें) तुरंत डेटाबेस पर जाएं। लेन-देन के रूप में निम्नानुसार ActiveRecord से व्युत्पन्न वर्ग पर लेन-देन विधि का उपयोग कर पाए जाते हैं: (। इस उदाहरण एकाधिक डेटाबेस के लिए है एक एकल डाटाबेस के लिए, आप केवल एक ही लेन-देन की जरूरत है।)

Student.transaction do 
    Course.transaction do 
    course.enroll(student) 
    student.units += course.units 
    end 
end 

फिर आप रोलबैक कर सकते हैं इन लेनदेन पर, लेनदेन के भीतर फेंक दिया अपवाद रोलबैक के बाद प्रचारित किया जाता है।

यह लेनदेन वाले डेटाबेस पर निर्भर करता है।

एनबी: लेनदेन में लपेटा और नष्ट कर दिया गया है।

+0

आपको इस तरह के लेनदेन घोंसले की आवश्यकता नहीं है। .transaction के लिए कोई भी कॉल ActiveRecord :: बेस पर पास हो जाती है। आप सचमुच केवल ActiveRecord :: Base.transaction को दो बार –

+0

पर कॉल कर रहे हैं यह रेल दस्तावेज से एक उदाहरण है। –

+0

आह! मुझे लगता है कि यह एकाधिक डेटाबेस के लिए आवश्यक है। अपडेट किया गया। –

4

डिफ़ॉल्ट रूप से लेनदेन के अंदर कोई डेटाबेस कोड लिखा नहीं गया है, आपको कोड में ऐसा करने के लिए कहने की आवश्यकता है।

def create 
    Model.transaction do 
    Model.create!(params[:model]) 
    Model.association.create!(params[:association]) 
    end 
    rescue ActiveRecord::RecordNotSaved, ActiveRecord::RecordInvalid 
    flash[:notice] = "That record could not be saved." 
    render :action => "new" 
end 

#create का उपयोग करना! विधियां रिकॉर्ड को सहेजने का प्रयास करेंगी और यदि वे असफल हों तो वे एक अपवाद उठाएंगे जो लेनदेन ब्लॉक के अंदर पहले से किए गए किसी भी कोड को रोलबैक करेगा।

यदि आप कार्रवाई को नहीं बचाते हैं तो आपको एक सार्वजनिक स्थिति में 405.html पर पुनर्निर्देशित किया जाएगा यदि कोई मौजूद है।

संबंधित मुद्दे