2011-10-24 15 views
5

में डेटाबेस-सुरक्षित Concurrency रूबी ऑन रेल में समेकन का निपटारा कैसे पता लगाने की कोशिश कर रहा है।आरओआर

डेटाबेस में लाइनों को लॉक करने के लिए कोड का सेगमेंट कैसे प्राप्त करें और आवश्यकता होने पर रोलबैक को बल दें?

अधिक विशिष्ट रूप से, क्या कोड का एक निश्चित खंड पूरी तरह से पूरा करने के लिए मजबूर करने का कोई तरीका है और रोलबैक नहीं है? मैं अपने प्रोजेक्ट में लेनदेन में इतिहास जोड़ना चाहता हूं और मैं नहीं चाहता कि लेन-देन इतिहास के बिना किए जा सकें ताकि सर्वर दो कार्यों (लेनदेन को सहेजने और इतिहास को सहेजने) के बीच आता है, तो डेटाबेस में जा सकता है एक अवैध राज्य

उत्तर

5

आप ActiveRecord Transactions और Pessimistic Locking को देखने के लिए चाहते हैं।

Account.transaction do 
    account = Account.find(account_id) 
    account.lock! 

    if account.balance >= 100 
    account.balance -= 100 
    account.save 
    end 
end 
+0

क्या लेनदेन के भीतर डेटाबेस पर बयान भी किया जा सकता है? – Nayish

+0

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

+0

और यदि अंत में यदि किसी भिन्न लेनदेन से कुछ बदलकर विफल हो जाता है? – Nayish

1

हां, आपके पास रेल में लेनदेन को लागू करने का एक तरीका है। एक उदाहरण:

YourModel.transaction do 
    rec1.save! 
    rec2.save! 
end 

अधिक जानकारी here

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