2012-01-27 17 views
8

अवलोकन: मैं दोनों एक वेबपेज और एक वेब कार्यकर्ता से एक IndexedDB तक पहुँचने के साथ एक रेस स्थिति से बचने के लिए कोशिश कर रहा हूँ।प्रवेश IndexedDB

सेटअप: वेबपृष्ठ जो स्थानीय इंडेक्सड डीबी में आइटम सहेज रहा है क्योंकि उपयोगकर्ता साइट के साथ काम करता है। जब भी कोई उपयोगकर्ता स्थानीय डीबी में डेटा सहेजता है तो रिकॉर्ड को "अनसेंट" के रूप में चिह्नित किया जाता है।

वेब-वर्कर पृष्ठभूमि थ्रेड जो इंडेक्सड डीबी से डेटा खींच रहा है, इसे सर्वर पर भेज रहा है और एक बार जब सर्वर इसे प्राप्त करता है, तो इंडेक्सड डीबी में डेटा को "प्रेषित" के रूप में चिह्नित किया जाता है।

समस्या: के बाद से IndexedDB पर पहुँच अतुल्यकालिक है, मैं इसकी गारंटी नहीं किया जा सकता है कि उपयोगकर्ता एक ही समय वेब कार्यकर्ता सर्वर पर भेज रहा है पर एक रिकार्ड अपडेट नहीं होगा। समय नीचे दिखाया गया है:

  1. वेब कार्यकर्ता डीबी से डेटा हो जाता है और सर्वर
  2. हस्तांतरण हो रहा है जबकि को भेज देता है, उपयोगकर्ता डेटा डीबी में सहेजकर अद्यतन करता है।
  3. वेब कार्यकर्ता सर्वर से प्रतिक्रिया हो जाता है और उसके बाद डीबी अद्यतन करता है "प्रेषित" करने के लिए
  4. अब डीबी में डेटा है कि सर्वर के लिए भेजा नहीं किया गया है लेकिन चिह्नित के रूप में "प्रेषित"
नहीं है

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

उदाहरण: सर्वर के बाद कहते हैं डेटा सहेजा जाता है, तो:

IndexedDB.HasDataChanged(
    function(changed) { 
     // Since this is async, this changed boolean could be lying. 
     // The data might have been updated after I checked and before I was called. 
     if (!changed){ 
      IndexedDB.UpdateToSent() } 
    }); 

अन्य नोट: डब्ल्यू 3 कल्पना के अनुसार एक सिंक एपीआई नहीं है, लेकिन कोई भी तो यह कर सकते हैं फिर भी यह लागू किया गया है इस्तेमाल नहीं किया जाएगा (http://www.w3.org/TR/IndexedDB/#sync-डेटाबेस)। सिंक एपीआई को इस सटीक स्थिति से बचने के लिए वेब-वर्कर्स द्वारा उपयोग करने के लिए डिज़ाइन किया गया था, जिसे मैं मानता हूं।

इस पर किसी भी विचार की सराहना की जाएगी। लगभग एक हफ्ते तक इस पर काम कर रहे हैं और काम करने वाले किसी भी चीज़ के साथ आने में सक्षम नहीं हैं।

उत्तर

2

मुझे लगता है कि मुझे इसके लिए अभी एक काम मिल गया है। वास्तव में उतना साफ नहीं है जितना मैं चाहूंगा, लेकिन ऐसा लगता है कि यह थ्रेड सुरक्षित है।

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

self.postMessage('UpdateDataSent#' + data.ID + '#' + data.LastEdit); 

तब ब्राउज़र में मैं अपने भेजा ध्वज को अद्यतन करने कर रहा हूँ, जब तक अंतिम संपादन तारीख नहीं बदला है।

// Get the data from the DB in a transaction 
if (data.LastEdit == lastEdit) 
{ 
    data.Sent = true; 
    var saveStore = trans.objectStore("Data"); 
    var saveRequest = saveStore.put(data); 
    console.log('Data updated to Sent'); 
} 

चूंकि यह ब्राउज़र पक्ष में लेनदेन में किया जाता है, ऐसा लगता है कि यह ठीक काम करता है। एक बार जब ब्राउज़र सिंक एपीआई का समर्थन करता है तो मैं इसे सब कुछ दूर फेंक सकता हूं।

0

क्या आप एक लेनदेन का उपयोग कर सकते हैं?
https://developer.mozilla.org/en/IndexedDB/IDBTransaction

+0

मुझे नहीं लगता कि आप एक सौदे का उपयोग किए बिना एक IndexedDB का उपयोग कर सकते है। समस्या यह है कि जब मैं सर्वर को डेटा भेजता हूं तो लेनदेन खुला नहीं रहेगा। – Shawn

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