खोज…


टिप्पणियों

लेन-देन सुरक्षात्मक ब्लॉक हैं जहां SQL कथन केवल स्थायी हैं यदि वे सभी एक परमाणु कार्रवाई के रूप में सफल हो सकते हैं। क्लासिक उदाहरण दो खातों के बीच एक हस्तांतरण है जहां आप केवल एक जमा कर सकते हैं यदि निकासी सफल हुई और इसके विपरीत। लेनदेन डेटाबेस की अखंडता को लागू करते हैं और प्रोग्राम त्रुटियों या डेटाबेस ब्रेक-डाउन के खिलाफ डेटा की रक्षा करते हैं। इसलिए मूल रूप से आपको लेन-देन ब्लॉकों का उपयोग करना चाहिए जब भी आपके पास कई बयान हों जिन्हें एक साथ निष्पादित किया जाना चाहिए या बिल्कुल नहीं।

मूल उदाहरण

उदाहरण के लिए:

ActiveRecord::Base.transaction do
  david.withdrawal(100)
  mary.deposit(100)
end

यह उदाहरण केवल डेविड से पैसे लेगा और मैरी को देगा यदि न तो निकासी और न ही जमा एक अपवाद को बढ़ाता है। अपवाद लेन-देन को बाध्य करेगा जो लेनदेन शुरू होने से पहले डेटाबेस को राज्य में लौटाता है। हालाँकि, अवगत रहें, कि वस्तुओं में उनकी आवृत्ति डेटा उनके पूर्व-लेन-देन की स्थिति में वापस नहीं आएगी।

एकल लेनदेन में विभिन्न ActiveRecord कक्षाएं

हालांकि लेनदेन वर्ग विधि को कुछ ActiveRecord वर्ग पर कहा जाता है, लेन-देन ब्लॉक के भीतर की वस्तुओं को उस वर्ग के सभी उदाहरण नहीं होने चाहिए। ऐसा इसलिए है क्योंकि लेनदेन प्रति-डेटाबेस कनेक्शन हैं, प्रति मॉडल नहीं।

इस उदाहरण में, लेन-देन का रिकॉर्ड लेन-देन के हिसाब से सहेजे जाने के बावजूद भी लेन-देन रिकॉर्ड में सहेजा जाता है:

Account.transaction do
  balance.save!
  account.save!
end

लेन-देन विधि एक मॉडल उदाहरण विधि के रूप में भी उपलब्ध है। उदाहरण के लिए, आप यह भी कर सकते हैं:

balance.transaction do
  balance.save!
  account.save!
end

एकाधिक डेटाबेस कनेक्शन

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

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

यह एक खराब समाधान है, लेकिन पूरी तरह से वितरित लेनदेन ActiveRecord के दायरे से परे हैं।

सहेजना और नष्ट करना स्वचालित रूप से लेनदेन में लिपटे हुए हैं

#Save और #destroy दोनों एक लेनदेन में लिपटे हुए हैं जो यह सुनिश्चित करता है कि आप जो कुछ भी मान्यताओं या कॉलबैक में करते हैं वह आपके संरक्षित कवर के तहत होगा। इसलिए आप उन मानों की जांच के लिए सत्यापन का उपयोग कर सकते हैं, जो लेन-देन निर्भर करता है या आप कॉलबैक में अपवादों को रोलबैक करने के लिए उठा सकते हैं, जिसमें after_* कॉलबैक भी शामिल हैं।

परिणामस्वरूप डेटाबेस में परिवर्तन आपके कनेक्शन के बाहर नहीं देखा जाता है जब तक कि ऑपरेशन पूरा नहीं होता है। उदाहरण के लिए, यदि आप किसी खोज इंजन के सूचकांक को after_save में अद्यतन करने का प्रयास करते हैं, तो अनुक्रमणिका को अद्यतन रिकॉर्ड दिखाई नहीं देगा। after_commit कॉलबैक केवल एक ही है जिसे अपडेट किए जाने के बाद ट्रिगर किया जाता है।

कॉलबैक

दो प्रकार के कॉलबैक हैं जो after_commit और रोलिंग बैक लेनदेन से जुड़े हैं: after_commit और after_rollback

after_commit कॉलबैक लेन-देन के तुरंत बाद एक लेनदेन के भीतर सहेजे या नष्ट किए गए हर रिकॉर्ड पर कॉल किए जाते हैं। after_rollback कॉलबैक को लेनदेन के बाद तुरंत सहेजे या नष्ट किए गए हर रिकॉर्ड पर कॉल किया जाता है, लेनदेन या savepoint को वापस ले जाने के बाद।

ये कॉलबैक अन्य प्रणालियों के साथ बातचीत करने के लिए उपयोगी हैं क्योंकि आपको इस बात की गारंटी दी जाएगी कि कॉलबैक केवल तब निष्पादित किया जाता है जब डेटाबेस एक स्थायी स्थिति में होता है। उदाहरण के लिए, after_commit किसी कैश को साफ़ करने के लिए हुक लगाने के लिए एक अच्छा स्थान है क्योंकि डेटाबेस से अपडेट होने से पहले इसे किसी लेन-देन से साफ़ करने से कैश को ट्रिगर किया जा सकता है।

लेन-देन वापस करना

ActiveRecord::Base.transaction अन्य असाधारण स्थितियों से एक जानबूझकर रोलबैक को अलग करने के लिए ActiveRecord::Rollback अपवाद का उपयोग करता है। आम तौर पर, एक अपवाद को बढ़ाने के लिए .transaction विधि डेटाबेस लेनदेन रोलबैक और अपवाद पर पारित करने के लिए कारण होगा। लेकिन अगर आप एक ActiveRecord::Rollback अपवाद बढ़ाते हैं, तो डेटाबेस ट्रांजेक्शन को बिना अपवाद के पास किए बिना वापस ले लिया जाएगा।

उदाहरण के लिए, आप लेन-देन रोलबैक करने के लिए अपने कंट्रोलर में ऐसा कर सकते हैं:

class BooksController < ActionController::Base
  def create
    Book.transaction do
      book = Book.new(params[:book])
      book.save!
      if today_is_friday?
        # The system must fail on Friday so that our support department
        # won't be out of job. We silently rollback this transaction
        # without telling the user.
        raise ActiveRecord::Rollback, "Call tech support!"
      end
    end
    # ActiveRecord::Rollback is the only exception that won't be passed on
    # by ActiveRecord::Base.transaction, so this line will still be reached
    # even on Friday.
    redirect_to root_url
  end
end


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow