2010-04-23 9 views
12

मैं एक शुरुआत जोड़ना चाहता हूं ... मेरे नियंत्रकों में से एक को बचाव ब्लॉक, बेहतर जानकारी लॉग इन करने और क्लाइंट पर वापस आने के लिए सही त्रुटि संदेश बनाने के लिए विधि बनाएं। क्या बचाव किसी भी तरह से रोलबैक प्रक्रिया को 'बाधित' करता है?यदि मैं शुरू होता हूं तो रेलवे रोलबैक करता है ... बचाव?

मुझे लगता है कि रेल स्वचालित रूप से रोलबैक करता है। यह कब होता है? क्या यह बचाव खंड में मिलने के समय से पहले ही हुआ है?

मैं ड्रीमहोस्ट पर mySQL का उपयोग कर रहा हूं और मुझे लगता है कि वे innoDB का उपयोग करते हैं।

+0

कृपया इस जवाब में एक बार देख ले: http://stackoverflow.com/questions/14329877/render-failing-to-render-correct-template-in-rescue-from- activerecordrollback/35731832 # 35731832 – monteirobrena

उत्तर

0

बस begin का उपयोग कर ... rescue लेनदेन को रोलबैक करने के लिए पर्याप्त नहीं है।

ModelName.transaction do 
end 

इस को बचाने के लिए एक फोन पर स्पष्ट रूप से किया जाता है, ताकि आपके कॉलबैक सभी को एक साथ क्रियान्वित कर रहे हैं: आप प्रयोग करना होगा। आप अपने बचाव ब्लॉक में क्या अपवाद पकड़ रहे हैं? आप क्या जवाब दे रहे हैं किस तरह की त्रुटियां?

+0

मुझे डेडलॉक्स मिल रहे हैं। मुझे नहीं लगता कि इसका वर्णन करने के लिए यहां पर्याप्त जगह होगी। यह एक कार्ड गेम के लिए है। लेकिन मेरे प्लेयरएक्शन मॉडल के लिए बाद के संस्करण कॉलबैक विधि में, मैं एक और प्लेयर एक्शन उदाहरण बना देता हूं। मुझे उनके संबंधित मॉडल पर डेडलॉक्स मिल रहा है। जब ऐसा होता है, तो मैं पूरी चीज रोलबैक करना चाहता हूं, जिसमें पहले प्लेयरएक्शन मॉडल और उसके रिश्तों को बनाया गया था। लगता है जैसे आप कह रहे हैं कि रेल स्वचालित लेनदेन नहीं करते हैं, है ना? मुझे उन्हें स्पष्ट रूप से शुरू करना होगा और रोलबैक ट्रिगर करना होगा? क्या इसके लिए कहीं संसाधन है? मैं खोज रहा हूं ... – user26270

+0

यह स्पष्ट लेनदेन करता है लेकिन केवल सहेजने और अपडेट_एट्रिब्यूट जैसी विधियों में। तो आपका after_save उसी लेनदेन में चलाएगा। – jonnii

+0

मुझे यकीन नहीं है कि डेडलॉक्स के बारे में क्या सुझाव देना है, कभी-कभी आप उनसे बचने के लिए चीजों को फिर से ऑर्डर कर सकते हैं। डेडलॉक्स पर पुनः प्रयास करने के लिए कुछ प्लगइन्स हैं (http://github.com/rails/deadlock_retry)। उन पर भी देखने लायक हो सकता है। – jonnii

14

मैं इसका प्रयोग कर रहा हूं। ऐसा लगता है जैसे आपका बचाव उस अपवाद को पकड़ता है जो रोलबैक का कारण बनता है, जो लेनदेन का हिस्सा पहले से ही हुआ है। मेरे मामले में, मैं चाहता हूं कि लेनदेन शुरू होने से पहले डेटाबेस वापस घुमाए, लेकिन मैं अभी भी अपवाद को संभालना चाहता हूं।

मैं इस के साथ समाप्त हो गया:

self.transaction do 
    first_operation 
    begin 
    operation_that_might_violate_db_constraint 
    rescue ActiveRecord::RecordNotUnique 
     #deal with the error 
     raise ActiveRecord::Rollback #force a rollback 
    end 
end 

raise ActiveRecord::Rollback हिस्सा यकीन है कि लेन-देन पूरी तरह से वापस लुढ़का हो जाता है बनाता है। इसके बिना, first_operation से किए गए परिवर्तनों को पूरा हो जाएगा। ताकि आप न आया हुआ अपवाद है कि त्रुटि पृष्ठ renders के साथ नहीं करना पड़ेगा

ActiveRecord :: रोलबैक, अपवाद है कि लेन-देन के स्तर से ऊपर बुलबुला नहीं है की एक विशेष प्रकार का है।

मुझे यकीन नहीं है कि यह करने का यह सोने का मानक तरीका है, लेकिन ऐसा लगता है।

+0

ध्यान रखें कि यदि आप लेनदेन ब्लॉक के अंदर अपवाद पकड़ते हैं और आप किसी ईमेल को भेजने जैसे बचाव में कुछ करना चाहते हैं, तो यह लेनदेन की वजह से विफल हो जाएगा। –

-2

तुम भी रोलबैक, पकड़ के लिए मेरा उत्तर कोशिश करते हैं और ActiveRecord का उपयोग कर अपने बनाने के विधि :: Base.transaction के लिए प्रतिपादन कर सकते हैं: - Click Here

धन्यवाद

-1

रोलबैक संसाधित नहीं किया।

पूर्व:

create_table "helps", :force => true do |t| 
    t.string "title",       :null => false 
    t.text  "content" 
end 

#Rails console 
Help.transaction do 
    Help.create! title: "aaa" 
    begin 
    Help.create! content: "111" 
    rescue 
    p "create error." 
    end 
    Help.create! title: "bbb" 
end 

#get this 
>> "create error." 
Help.count 
>> 2 
संबंधित मुद्दे

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