क्या मैं CouchDB में लेनदेन और ताले लगा सकता हूं?


81

मुझे लेनदेन (शुरू, कमिट या रोलबैक), ताले (अपडेट के लिए चयन) करने की आवश्यकता है। मैं इसे एक दस्तावेज़ मॉडल डीबी में कैसे कर सकता हूं?

संपादित करें:

मामला यह है:

  • मैं नीलामी स्थल चलाना चाहता हूं।
  • और मुझे लगता है कि कैसे खरीद के रूप में अच्छी तरह से निर्देशित करने के लिए।
  • प्रत्यक्ष खरीद में मुझे आइटम रिकॉर्ड में मात्रा क्षेत्र को घटाना है, लेकिन केवल अगर मात्रा शून्य से अधिक है। यही कारण है कि मुझे ताले और लेनदेन की आवश्यकता है।
  • मुझे नहीं पता कि ताले और / या लेनदेन के बिना इसे कैसे संबोधित किया जाए।

क्या मैं इसे CouchDB के साथ हल कर सकता हूं?

जवाबों:


145

नहीं। CouchDB एक "आशावादी संगामिति" मॉडल का उपयोग करता है। सबसे सरल शब्दों में, इसका मतलब यह है कि आप अपने अपडेट के साथ एक डॉक्यूमेंट वर्जन भेजते हैं, और काउचबीडी परिवर्तन को अस्वीकार कर देता है यदि वर्तमान डॉक्यूमेंट वर्जन आपके भेजे गए मेल से मेल नहीं खाता है।

यह वास्तव में भ्रामक है। आप CouchDB के लिए कई सामान्य लेनदेन आधारित परिदृश्यों को फिर से नामांकित कर सकते हैं। हालांकि CouchDB सीखते समय आपको अपने RDBMS डोमेन ज्ञान को फेंकना होगा। काउच को SQL आधारित दुनिया में ढालने का प्रयास करने के बजाय उच्च स्तर से समस्याओं का सामना करने में मददगार है।

इन्वेंट्री का ट्रैक रखना

आपके द्वारा उल्लिखित समस्या मुख्य रूप से एक इन्वेंट्री समस्या है। यदि आपके पास एक आइटम का वर्णन करने वाला दस्तावेज़ है, और इसमें "मात्रा उपलब्ध" के लिए एक फ़ील्ड शामिल है, तो आप इस तरह से समसामयिक मुद्दों को संभाल सकते हैं:

  1. दस्तावेज़ को पुनः प्राप्त करें, उस _revसंपत्ति का ध्यान रखें जिसे CouchDB साथ भेजता है
  2. मात्रा क्षेत्र घटाएँ, यदि यह शून्य से अधिक है
  3. _revसंपत्ति का उपयोग करके अद्यतन दस्तावेज़ वापस भेजें
  4. यदि _revवर्तमान में संग्रहीत संख्या से मेल खाता है, तो किया जाए!
  5. यदि कोई संघर्ष है (जब _revमेल नहीं खाता), तो नवीनतम दस्तावेज़ संस्करण पुनः प्राप्त करें

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

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

मैं एक "मास्टर उत्पाद" दस्तावेज़ के साथ शुरू करता हूं जिसमें सभी डिस्क्रिप्टर डेटा (नाम, चित्र, विवरण, मूल्य, आदि) शामिल हैं। फिर मैं प्रत्येक विशिष्ट उदाहरण के लिए "इन्वेंट्री टिकट" दस्तावेज़ जोड़ूंगा, product_keyऔर साथ के लिए फ़ील्ड claimed_by। आप हथौड़ा का एक मॉडल बेच रहे हैं, और बेचने के लिए उनमें से 20 है, तो आप की तरह कुंजी के साथ दस्तावेजों को हो सकता है hammer-1, hammer-2प्रत्येक उपलब्ध हथौड़ा प्रतिनिधित्व करने के लिए, आदि,।

फिर, मैं एक ऐसा दृश्य बनाऊंगा जो मुझे उपलब्ध हथौड़ों की एक सूची देता है, एक कम फ़ंक्शन के साथ जो मुझे "कुल" देखने देता है। ये पूरी तरह से कफ से बाहर हैं, लेकिन आपको यह अंदाजा लगाना चाहिए कि काम करने का तरीका कैसा होगा।

नक्शा

function(doc) 
{ 
    if (doc.type == 'inventory_ticket' && doc.claimed_by == null ) { 
        emit(doc.product_key, { 'inventory_ticket' :doc.id, '_rev' : doc._rev }); 
    } 
}

यह मुझे उत्पाद कुंजी द्वारा उपलब्ध "टिकट" की एक सूची देता है। मैं इनमें से एक समूह को पकड़ सकता हूं जब कोई हथौड़ा खरीदना चाहता है, तो अपडेट भेजने के माध्यम से पुनरावृति ( तब idऔर _revतब तक) जब तक मैं सफलतापूर्वक एक दावा नहीं करता (पहले दावा किए गए टिकट एक अपडेट त्रुटि का परिणाम होगा)।

कम करना

function (keys, values, combine) {
    return values.length;
}

यह कम करने वाला फ़ंक्शन केवल लावारिस inventory_ticketवस्तुओं की कुल संख्या लौटाता है , इसलिए आप बता सकते हैं कि कितने "हथौड़ों" की खरीद के लिए उपलब्ध हैं।

चेतावनियां

यह समाधान आपके द्वारा प्रस्तुत विशेष समस्या के लिए कुल सोच का लगभग 3.5 मिनट का प्रतिनिधित्व करता है। ऐसा करने के बेहतर तरीके हो सकते हैं! इसने कहा, यह परस्पर विरोधी अपडेट को काफी हद तक कम करता है, और एक नए अपडेट के साथ संघर्ष का जवाब देने की आवश्यकता पर कटौती करता है। इस मॉडल के तहत, आपके पास कई उपयोगकर्ता प्राथमिक उत्पाद प्रविष्टि में डेटा बदलने का प्रयास नहीं करेंगे। सबसे खराब स्थिति में, आपके पास एक ही टिकट का दावा करने का प्रयास करने वाले कई उपयोगकर्ता होंगे, और यदि आपने उनमें से कई को अपने दृश्य से पकड़ लिया है, तो आप बस अगले टिकट पर जाते हैं और फिर से प्रयास करते हैं।

संदर्भ: https://wiki.apache.org/couchdb/Frequently_asked_questions#How_do_I_use_transactions_with_CouchDB.3F


4
यह मेरे लिए स्पष्ट नहीं है कि आप 'टिकट' कैसे प्राप्त कर सकते हैं, जिसे आप अनुक्रम में दावा करने का प्रयास करते हैं, मास्टर इकाई को अपडेट करने के लिए केवल पढ़ने / संशोधित / लिखने का पुनः प्रयास करने पर एक महत्वपूर्ण सुधार है। निश्चित रूप से यह अतिरिक्त ओवरहेड के लायक नहीं लगता है, खासकर यदि आपके पास बड़ी मात्रा में स्टॉक है।
निक जॉनसन

4
मेरे दृष्टिकोण से, टिकट सम्मेलन का निर्माण करने के लिए "सरल" है। मास्टर प्रविष्टि पर विफल अपडेट के लिए आपको दस्तावेज़ को फिर से लोड करने, अपना ऑपरेशन फिर से करने और फिर सहेजने की आवश्यकता होती है। टिकट की बात आपको अधिक डेटा का अनुरोध किए बिना कुछ करने की कोशिश करने और "दावा" करने की अनुमति देती है।
श्रीकर्ट २५'०

इसके अलावा, यह निर्भर करता है कि आप किस प्रकार के ओवरहेड के बारे में चिंतित हैं। आप या तो बढ़े हुए विवाद के साथ लड़ने जा रहे हैं, या अतिरिक्त भंडारण आवश्यकताएं हैं। यह देखते हुए कि एक टिकट खरीद रिकॉर्ड के रूप में भी दोगुना हो सकता है, मुझे नहीं पता कि आपके पास भंडारण की समस्या जितनी होगी, जितना आप सोचते हैं।
२३

2
मैं एक उत्पाद दस्तावेज़ का एक मात्रा क्षेत्र संपादित कर रहा हूं। उदाहरण के लिए अगर मात्रा = 2K है तो मुझे हजारों "टिकट" बनाने होंगे। फिर मैं एक मात्रा कम कर रहा हूं, मुझे कुछ टिकट हटाना होगा। मेरे लिए पूरी तरह से असंबंधित लगता है। बुनियादी उपयोग के मामलों में बहुत अधिक सिरदर्द। शायद मुझे कुछ याद आ रहा है, लेकिन पहले से हटाए गए लेन-देन व्यवहार को वापस क्यों नहीं लाया जाए, बस इसे _bulk_docs जैसी किसी चीज़ के साथ वैकल्पिक बनाएं; अस्वीकार करें = ख़ारिज करें = सत्य। एकल-मास्टर कॉन्फ़िगरेशन में काफी उपयोगी।
सैम

3
@mehaase: इसे पढ़ें: guide.couchdb.org/draft/recipes.html , उत्तर काउचडब के आंतरिक डेटास्ट्रक्चर में उबलता है "आप डेटा को कभी नहीं बदलते हैं, आप सिर्फ नया जोड़ते हैं"। आपके परिदृश्य में इसका मतलब है कि खाते से डेबिट के लिए एक पारगमन खाते में एक (परमाणु) लेन-देन करना और इन-ट्रांजिट खाते से दूसरे (परमाणु) लेनदेन को आगे (या पीछे) करना है। ऐसा वास्तविक बैंक करते हैं। हर कदम हमेशा प्रलेखित होता है।
फेबियान ज़ींडल

26

MrKurt के उत्तर पर विस्तार करना। बहुत सारे परिदृश्यों के लिए आपको स्टॉक टिकटों को क्रम में रिडीम करने की आवश्यकता नहीं है। पहले टिकट का चयन करने के बजाय, आप शेष टिकटों से बेतरतीब ढंग से चयन कर सकते हैं। बड़ी संख्या में टिकट और समवर्ती अनुरोधों की एक बड़ी संख्या को देखते हुए, आपको उन टिकटों पर बहुत कम विवाद मिलेगा, बनाम हर कोई पहला टिकट पाने की कोशिश कर रहा है।


21

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

  • लेन-देन दस्तावेज़ बनाएं "खाता 10223 से USD 10 स्थानांतरण करें 88733 खाता"। इससे व्यवस्था में तनाव पैदा होता है।
  • सभी लेनदेन दस्तावेजों के लिए किसी भी तनाव स्कैन को हल करने के लिए और
    • यदि स्रोत खाता अपडेट नहीं है, तो स्रोत खाते को अपडेट करें (-10 USD)
    • यदि स्रोत खाता अपडेट किया गया था, लेकिन लेन-देन दस्तावेज़ यह नहीं दिखाता है तो लेन-देन दस्तावेज़ को अपडेट करें (उदाहरण के लिए दस्तावेज़ में ध्वज "sourcedone" सेट करें)
    • यदि लक्ष्य खाता अपडेट नहीं किया गया है तो लक्ष्य खाते को अपडेट करें (+10 USD)
    • यदि लक्ष्य खाता अपडेट किया गया था, लेकिन लेनदेन दस्तावेज़ यह नहीं दिखाता है तो लेनदेन दस्तावेज़ को अपडेट करें
    • यदि दोनों खाते अपडेट किए गए हैं तो आप लेन-देन के दस्तावेज़ को हटा सकते हैं या ऑडिटिंग के लिए रख सकते हैं।

तनाव के लिए स्कैनिंग सभी "तनाव दस्तावेजों" के लिए बैकएंड प्रक्रिया में होनी चाहिए ताकि सिस्टम के तनाव के समय को कम रखा जा सके। उपरोक्त उदाहरण में पहले खाते को अपडेट किए जाने के समय कम प्रत्याशित असंगतता होगी लेकिन दूसरा अभी तक अपडेट नहीं किया गया है। यह उसी तरह से ध्यान में रखा जाना चाहिए जिस तरह से आप अपने Couchdb वितरित होने पर अंततः सुसंगतता से निपटेंगे।

एक अन्य संभावित कार्यान्वयन लेनदेन की आवश्यकता से पूरी तरह से बचता है: बस तनाव दस्तावेजों को संग्रहीत करें और हर शामिल तनाव दस्तावेज़ का मूल्यांकन करके अपने सिस्टम की स्थिति का मूल्यांकन करें। ऊपर दिए गए उदाहरण में इसका अर्थ यह होगा कि किसी खाते के लिए कुल का निर्धारण केवल लेन-देन के दस्तावेजों में योग मान के रूप में किया जाता है जहाँ यह खाता शामिल है। काउचडब में आप इसे बहुत अच्छी तरह से एक नक्शे के रूप में / दृश्य को कम कर सकते हैं।


5
लेकिन उन मामलों के बारे में क्या है जहां खाते को डेबिट किया गया है लेकिन तनाव डॉक्टर को नहीं बदला गया है? उन दो बिंदुओं के बीच कोई भी विफलता परिदृश्य, अगर वे परमाणु नहीं हैं, तो स्थायी असंगतता का कारण होगा, है ना? प्रक्रिया के बारे में कुछ परमाणु होना चाहिए, यह एक लेनदेन का बिंदु है।
इयान वार्ले

हां, आप सही हैं, इस मामले में - जबकि तनाव हल नहीं हुआ है - असंगतता होगी। हालांकि, असंगतता केवल अस्थायी है जब तक कि तनाव दस्तावेजों के लिए अगला स्कैन यह पता नहीं लगाता है। इस मामले में यह व्यापार है, समय के संबंध में एक प्रकार की अंतिम स्थिरता। जब तक आप स्रोत को पहले ध्वस्त करते हैं और बाद में लक्ष्य खाते को बढ़ाते हैं तब तक यह स्वीकार्य हो सकता है। लेकिन खबरदार: तनाव दस्तावेज़ आपको REST के शीर्ष पर ACID लेनदेन नहीं देंगे। लेकिन वे शुद्ध रेस्ट और एसीआईडी ​​के बीच एक अच्छा ट्रेडऑफ बन सकते हैं।
ordnungswidrig

4
कल्पना करें कि प्रत्येक तनाव दस्तावेज में टाइमस्टैम्प है, और खाता दस्तावेजों में 'अंतिम-तनाव-लागू' फ़ील्ड है - या लागू तनावों की एक सूची है। जब आप स्रोत खाते को डेबिट करते हैं तो आप 'अंतिम-तनाव-लागू' फ़ील्ड को भी अपडेट करते हैं। वे दो ऑपरेशन परमाणु हैं क्योंकि वे एक ही दस्तावेज पर हैं। लक्ष्य खाते में भी एक समान फ़ील्ड है। इस तरह से सिस्टम हमेशा बता सकता है कि कौन से खातों में कौन से टेंशन डॉक्स लगाए गए हैं।
जेसी हैलेट 23

1
यह कैसे पता लगाया जाए कि स्रोत / गंतव्य दस्तावेज़ पहले ही अपडेट किया गया था? क्या होगा अगर यह चरण 1 के बाद विफल हो जाता है, तो फिर से निष्पादित होता है और फिर से विफल हो जाता है, और इसी तरह, आप स्रोत खाते में कटौती करते रहेंगे?
wump

1
@wump: आपको यह रिकॉर्ड करने की आवश्यकता होगी कि खाते पर तनाव दस्तावेज़ लागू किया गया है। उदाहरण के लिए या तो खाते की सूची संपत्ति पर तनाव दस्तावेज़ आईडी जोड़कर। जब टेंशन डॉक्यूमेंट द्वारा छपे सभी खाते अपडेट हो गए हैं तो टेंशन डॉक्यूमेंट को "किया" या हटा दें। बाद में दस्तावेज़ आईडी को सभी खातों के लिए सूची से हटा दिया जा सकता है।
ordnungswidrig

6

नहीं, CouchDB आम तौर पर लेन-देन के अनुप्रयोगों के लिए उपयुक्त नहीं है क्योंकि यह एक गुच्छेदार / प्रतिकृति वातावरण में परमाणु संचालन का समर्थन नहीं करता है।

CouchDB स्केलेबिलिटी के पक्ष में व्यवहारिक क्षमता का त्याग किया। परमाणु संचालन करने के लिए आपको एक केंद्रीय समन्वय प्रणाली की आवश्यकता होती है, जो आपकी मापनीयता को सीमित करती है।

यदि आप गारंटी दे सकते हैं कि आपके पास केवल एक CouchDB उदाहरण है या कि हर कोई एक विशेष दस्तावेज़ को संशोधित करके उसी CouchDB उदाहरण से जोड़ता है, तो आप ऊपर वर्णित विधियों का उपयोग करके एक प्रकार की एटमॉसिटी बनाने के लिए संघर्ष का पता लगाने वाली प्रणाली का उपयोग कर सकते हैं, लेकिन यदि आप बाद में किसी क्लस्टर में स्केल करते हैं या क्लाउडेंट जैसी होस्ट की गई सेवा का उपयोग करें यह टूट जाएगा और आपको सिस्टम के उस हिस्से को फिर से बनाना होगा।

इसलिए, मेरा सुझाव आपके खाते में शेष राशि के लिए CouchDB के अलावा कुछ का उपयोग करना होगा, यह बहुत आसान होगा।


5

ओपी की समस्या के जवाब के रूप में, काउच शायद यहां सबसे अच्छा विकल्प नहीं है। विचारों का उपयोग करना इन्वेंट्री का ट्रैक रखने का एक शानदार तरीका है, लेकिन 0 से क्लैम्पिंग कम या ज्यादा असंभव है। जब आप किसी दृश्य का परिणाम पढ़ते हैं, तो दौड़ की स्थिति में समस्या यह है कि आप "हथौड़ा -1" आइटम का उपयोग करने के लिए ठीक हैं, और फिर इसका उपयोग करने के लिए एक डॉक्टर लिखें। समस्या यह है कि केवल हथौड़े का उपयोग करने के लिए डॉक्टर को लिखने का कोई परमाणु तरीका नहीं है यदि दृश्य का परिणाम यह है कि वहाँ> 0 हथौड़ा -1 हैं। यदि 100 उपयोगकर्ता एक ही समय में दृश्य को क्वेरी करते हैं और 1 हथौड़ा -1 देखते हैं, तो वे सभी एक हथौड़ा 1 का उपयोग करने के लिए एक डॉक्टर लिख सकते हैं, जिसके परिणामस्वरूप -99 हथौड़ा -1 है। व्यवहार में, दौड़ की स्थिति काफी छोटी होगी - यदि आपका DB लोकलहोस्ट चल रहा है तो वास्तव में छोटा है। लेकिन एक बार जब आप स्केल करते हैं, और एक ऑफ साइट डीबी सर्वर या क्लस्टर होता है, तो समस्या बहुत अधिक ध्यान देने योग्य होगी।

MrKurt की प्रतिक्रिया के लिए एक अद्यतन (यह सिर्फ दिनांकित हो सकता है, या वह कुछ CouchDB सुविधाओं से अनजान हो सकता है)

काउचबडी में संतुलन / आविष्कारों जैसी चीजों को संभालने का एक अच्छा तरीका है।

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

इन्वेंट्री बैलेंस को ट्रैक करने के लिए एक सरल दृश्य इस तरह दिखना चाहिए (मेरे सिर के ऊपर से भी)

function( doc )
{
    if( doc.InventoryChange != undefined ) {
        for( product_key in doc.InventoryChange ) {
            emit( product_key, 1 );
        }
    }
}

और कम फ़ंक्शन और भी सरल है

_sum

यह बिल्ट इन कम फंक्शन का उपयोग करता है जो कि मैचिंग कीज़ के साथ सभी पंक्तियों के मानों को समेटता है।

इस दृश्य में, किसी भी डॉक्टर के पास "InventoryChange" सदस्य हो सकते हैं जो product_key के नक्शे को उनमें से कुल इन्वेंट्री में बदल सकते हैं। अर्थात।

{
    "_id": "abc123",
    "InventoryChange": {
         "hammer_1234": 10,
         "saw_4321": 25
     }
}

10 हथौड़ा_1234 और 25 आरा_4321 जोड़ देगा।

{
    "_id": "def456",
    "InventoryChange": {
        "hammer_1234": -5
    }
}

इन्वेंट्री से 5 हथौड़ों को जलाया जाएगा।

इस मॉडल के साथ, आप कभी भी कोई डेटा अपडेट नहीं कर रहे हैं, केवल एप्लाइड कर रहे हैं। इसका मतलब है कि अपडेट टकराव का कोई अवसर नहीं है। डेटा को अपडेट करने के सभी लेन-देन के मुद्दे दूर हो जाते हैं :)

इस मॉडल के बारे में एक और अच्छी बात यह है कि DB में कोई भी दस्तावेज इन्वेंट्री से आइटम को जोड़ और घटा सकता है। इन दस्तावेजों में सभी प्रकार के अन्य डेटा हो सकते हैं। आपके पास एक "शिपमेंट" दस्तावेज़ हो सकता है जिसमें प्राप्त तिथि, समय और गोदाम के बारे में डेटा का एक गुच्छा होता है, कर्मचारी प्राप्त करता है आदि और जब तक कि डॉक्टर एक इन्वेंटरीचेंज को परिभाषित करता है, यह इन्वेंट्री को अपडेट करेगा। जैसा कि एक "बिक्री" डॉक्टर, और एक "डैमेजिडेम" डॉक्टर आदि कर सकते हैं, प्रत्येक दस्तावेज़ को देखते हुए, वे बहुत स्पष्ट रूप से पढ़ते हैं। और दृश्य सारी मेहनत को संभालता है।


दिलचस्प रणनीति। CouchDB newb के रूप में यह प्रतीत होता है कि हथौड़ों की वर्तमान संख्या की गणना करने के लिए, आपको हथौड़ों के लिए कंपनी के इन्वेंट्री परिवर्तन के पूरे इतिहास पर एक नक्शा / कम करना होगा । यह परिवर्तन के लायक वर्ष हो सकता है। क्या CouchDB की कुछ अंतर्निहित सुविधा है जो इस प्रदर्शन को बनाएगी?
चड्रिक 17

हां, काउचडीबी में विचार एक निरंतरता, निरंतर मानचित्र / कम करने जैसे हैं। आप सही हैं कि इसे बड़े डेटा सेट पर स्क्रैच से शुरू करने में उम्र लग जाएगी, लेकिन जब नए दस्तावेज़ जोड़े जाते हैं, तो वे केवल मौजूदा दृश्य को अपडेट करते हैं, इसके लिए पूरे दृश्य को पुनर्गणना नहीं करना पड़ता है। ध्यान रखें कि विचारों के लिए अंतरिक्ष और सीपीयू दोनों की आवश्यकता है। इसके अलावा, कम से कम जब मैंने पेशेवर रूप से CouchDB के साथ काम किया (कुछ साल हो गए हैं), तो केवल कम किए गए कार्यों में निर्मित का उपयोग करना बहुत महत्वपूर्ण था। _सुम। कस्टम जावास्क्रिप्ट को कम करने के कार्य बेहद धीमे थे
दीवारर

3

वास्तव में, आप एक तरह से कर सकते हैं। HTTP दस्तावेज़ API पर एक नज़र डालें और शीर्षक पर स्क्रॉल करें "एकल अनुरोध के साथ एकाधिक दस्तावेज़ संशोधित करें"।

मूल रूप से आप URI / {dbname} / _ बल्क_डॉक्स के लिए एक ही पोस्ट रिक्वेस्ट में डॉक्यूमेंट्स का एक गुच्छा बना / अपडेट / डिलीट कर सकते हैं और वे या तो सभी सफल होंगे या सभी विफल रहेंगे। दस्तावेज़ चेतावनी देता है कि यह व्यवहार भविष्य में बदल सकता है, हालांकि।

संपादित करें: जैसा कि अनुमान लगाया गया है, संस्करण 0.9 से बल्क डॉक्स अब इस तरह से काम नहीं करते हैं।


यह वास्तव में चर्चा की जा रही स्थिति में मदद नहीं करेगा, यानी कई उपयोगकर्ताओं से एकल डॉक्स पर विवाद।
केर

3
CouchDB 0.9 से शुरू होकर, बल्क अपडेट के शब्दार्थ बदल गए हैं।
बैरी वार्क

0

लेन-देन के लिए बस SQlite हल्के समाधान का उपयोग करें, और जब लेनदेन सफलतापूर्वक पूरा हो जाए तो इसे दोहराएं, और इसे SQLite में दोहराया गया

SQLite तालिका

txn_id    , txn_attribute1, txn_attribute2,......,txn_status
dhwdhwu$sg1   x                    y               added/replicated

आप उन लेनदेन को भी हटा सकते हैं जिन्हें सफलतापूर्वक दोहराया गया है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.