2013-07-03 3 views
38

फायरबेस एक संसाधन के लिए transactionally अद्यतन करने की अनुमति देता है। जैसा कि मैं इसे समझता हूं, क्लाइंट यह सर्वर से अनुरोध भेजता है कि "यदि पुराना मान एक्स है, तो नया मान वाई बनाएं"। यदि विवाद हो तो सर्वर क्लाइंट के रूप में कई अपडेट अस्वीकार कर सकता है जब तक कि कोई स्वीकार नहीं किया जाता है।फायरबेस: मैं परमाणु रूप से एकाधिक संसाधन कैसे अपडेट करूं?

अब, अगर मैं परमाणु रूप से एकाधिक संसाधन अपडेट करना चाहता हूं तो क्या होगा?

क्या होता है यदि पहला अपडेट स्वीकार किया जाता है, और फिर ग्राहक को दूसरे अपडेट को स्वीकार करने से पहले डिस्कनेक्ट किया जाता है। क्या परमाणु लेनदेन में कई अपडेट संलग्न करने का कोई तरीका है? यदि नहीं, तो क्या इस समस्या का एक मूर्ख समाधान है?

उत्तर

44

अद्यतन

अब यह atomically कई स्थानों अद्यतन करने के लिए संभव है। विवरण के लिए this blog post देखें।

var mergedUpdate = {}; 
mergedUpdate[ 'users/' + userId + '/widgets/' + widgetId ] = true; 
mergedUpdate[ 'widgets/' + widgetId ] = widgetData; 

var ref = new Firebase("https://<YOUR-FIREBASE-APP>.firebaseio.com/"); 
ref.update(mergedUpdate); 

यह लेनदेन डेटा लागू नहीं करता है (अगर मान अभी एक्स है, यह Y कर), लेकिन इस हिस्से security rules के लिए ले जाया जा सकता है। उदाहरण के लिए, अगर हम एक ही समय में दो काउंटर अद्यतन करना चाहते हैं, हम नियम जोड़ सकता है इस प्रकार है:

{ 
    "counter1": { 
    ".validate": "newData.val() === (data.val()||0)+1" 
    }, 

    "counter2"1 { 
    ".validate": "newData.val() === (data.val()||0)+1" 
    } 
} 

अब हम एक ही बहु पथ अद्यतन के रूप में इसके बाद के संस्करण का प्रयास कर सकते हैं। यदि मूल्यों को बदल दिया गया है क्योंकि हम उन्हें सर्वर से पिछली बार पढ़ते हैं, तो प्रयास विफल हो जाएगा। यह देखने के लिए कि विफलता सत्यापन के कारण हुई थी, और 0 के अनुसार पुनः प्रयास करें, हम if(error.code === 'PERMISSION_DENIED') { ... } देख सकते हैं।

मूल पोस्ट

यह करने के लिए एक ही रास्ता एक आम पूर्वज पर लेन-देन को चलाने के लिए है।

उदाहरण के लिए, यदि आप अपडेट/ए/बी/सी और/ए/एक्स/वाई अपडेट करना चाहते हैं, तो आप एक लेनदेन चला सकते हैं और दोनों मानों को बदल सकते हैं।

इस दृष्टिकोण का नकारात्मक पक्ष यह है कि यह नेटवर्क I/O के साथ महंगा हो सकता है, क्योंकि लेनदेन के अंदर के सभी डेटा को डाउनलोड करने की आवश्यकता है और फिर सर्वर पर वापस भेजा जाना चाहिए।

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

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

यह हमारा दृष्टिकोण है जो हम अपने सहयोगी पाठ संपादक Firepad के साथ लेते हैं।

+0

आपके उत्तर के लिए धन्यवाद। मैं अवधारणात्मक रूप से जगह पर अपडेट करने के बजाय नए लेनदेन को संग्रहित करना पसंद करता हूं, लेकिन मुझे लगता है कि यदि कोई क्वेरी भौतिककरण सुविधा है तो यह प्रदर्शन परिप्रेक्ष्य से केवल काम करने योग्य है। पूरे इतिहास को दोबारा शुरू करना धीमा होगा। –

+0

कोई नहीं है (कम से कम अभी तक नहीं), लेकिन हम निश्चित रूप से देखते हैं कि यह कैसे उपयोगी होगा! अभी के लिए आप क्लाइंट पर क्वेरी को पूरा कर सकते हैं और इसे फायरबेस में "चेकपॉइंट" पर संग्रहीत कर सकते हैं (इस प्रकार फ़ायरपैड काम करता है), या आपके पास कोई node.js या जावा-आधारित सर्वर हो सकता है जो कहीं फ़ायरबेस क्लाइंट के रूप में चल रहा हो तुम्हारे लिए। –

+0

HI! Thanx, लेकिन मैंने बस कोशिश की और एक त्रुटि मिली: "लाइन 10: बाएं ऑपरेंड || बूलियन होना चाहिए।" क्या मैं कुछ भूल रहा हूँ? मैं फायरबेस 3.0 का उपयोग कर रहा हूं ... –

0

एक और तरीका है .... बहुत कठिन नहीं है ... और नहीं वास्तव में लेनदेन ...

Firebase atomically की अनुमति देता है एक मूल्य पर परिवर्तन के रूप में, आप के अर्थ के साथ एक लॉक या सेमाफोर बना सकते हैं "शुरू कर दिया संसाधन एक्स, वाई और जेड पर एक लेनदेन "...बेशक, यह वास्तविक लेनदेन नहीं है क्योंकि यह लॉक से एक हिस्सा संसाधनों को अवरुद्ध नहीं करता है। हम इसे सम्मेलन द्वारा लेनदेन कह सकते हैं। ग्राहकों को यह जानने की जरूरत है कि जब लॉक पर कब्जा होता है, तो उन्हें एक्स, वाई और जेड संसाधनों को नहीं बदला जाना चाहिए ....

+2

यह तोड़ता है जब दो ग्राहक एक साथ सैमफोर के लिए पूछते हैं। असली ताला नहीं है, इसलिए यह समवर्ती मुद्दे को हल नहीं करता है, बस संभावनाओं को कम करता है। –

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