2017-09-07 3 views
6

मेरे पास एक ऐसा फ़ंक्शन है जिसे मैंने अनुक्रमिक संख्या की पीढ़ी के लिए लिखा था। समारोह इस प्रकार है:कोई ताले मौजूद नहीं होने पर XDMP-LOCKED त्रुटि प्राप्त करें

declare function generate-instrument-Id($cnt as xs:int?) 
as xs:int { 
    let $count := if($cnt and $cnt > 0) then $cnt else 1 
    let $url := '/private/instrumentId-Sequence.xml' 
    (: this redirection is needed to write id in another 
     transaction context :) 
    return xdmp:invoke-function(function() { 
       let $id := fn:doc($url)/instrument/@nextId 
       let $_ := xdmp:node-replace($id 
          , attribute nextId { $id + $count }) 
       return $id 
      } 
     ) 
}; 

समारोह निम्नलिखित परीक्षण कोड का उपयोग कर एक qconsole खिड़की से ठीक काम करता है:

let res := util:generate-instrument-Id(1) 
return fn:error(fn:QName("test", $res)) 

यानी यह एक और लेन-देन के संदर्भ में निष्पादित करता है और दस्तावेज़ सही ढंग से अद्यतन करता है। हालांकि, जब मैं एक बाकी सेवा से एक ही समारोह कॉल करने के लिए प्रयास करते हैं, यह निम्न त्रुटि संदेश देता है:

XDMP-LOCKED: xdmp:node-replace(fn:doc("/private/instrumentId-Sequence.xml")/instrument/@nextId, attribute{fn:QName("","nextId")}{"1228"}) -- Document or Directory is locked 

कृपया ध्यान दें कि मैं इस समस्या को अलग करने की सेवा इंटरफ़ेस से कोड के हर टुकड़ा साफ और अभी भी एक ही त्रुटि संदेश प्राप्त करें।

  • क्या शर्तों के तहत इस त्रुटि जारी किया जाता है:

    तो यहाँ मेरी सवाल कर रहे हैं?

  • मुझे यकीन है कि इस दस्तावेज़ पर कोई तालाब नहीं है (या निर्देशिका जिसे इसे नीचे रखा गया है) किसी भी अन्य प्रक्रिया से, तो इस तरह के झूठे अलार्म को ट्रिगर कर सकता है?
  • चूंकि यह क्यूकनसोल से काम करता है, इसलिए मुझे लगता है कि प्रोग्राम को निष्पादित करते समय मैं यह करता हूं कि मैं इस समस्या को हल कर सकता हूं। Qconsole प्रोग्राम कैसे निष्पादित करता है इस पर कोई दस्तावेज?

धन्यवाद एक बहुत
लालकृष्ण

पुनश्च: मैं एक विंडोज़ सर्वर

+1

वहाँ किसी भी संभावना है कि समारोह एक बार से अधिक लागू हो जाता है है देख सकते हैं दूसरों की मदद करने के लिए इस जानकारी साझा करना चाहिए? साथ ही, आप ' अलग-अलग लेनदेन' में पास करना चाहेंगे। यह invoke और eval के लिए डिफ़ॉल्ट नहीं है। – grtjn

+0

@grtjn: मैंने वास्तव में कुछ अलग अलगाव विकल्पों के साथ परीक्षण किया; उनमें से कोई भी काम नहीं करता है।यह भी प्रतीत होता है कि अलग-अलग लेन-देन डिफ़ॉल्ट विकल्प है, जैसा कि qconsole में फ़ंक्शन के सही निष्पादन द्वारा सिद्ध किया गया था। और, कोई अन्य कॉल नहीं है: यह सुनिश्चित करने के लिए कि मैंने सेवा कोड में हर दूसरे कॉल को हटा दिया है और केवल इस फ़ंक्शन पर कॉल छोड़ दिया है –

+0

वैसे, क्या आपने इसके बजाय यादृच्छिक आईडी का उपयोग करने पर विचार किया है? अनुक्रमिक आईडी के ऊपर पसंद करने के अच्छे कारण हैं। विवरण के लिए यहां देखें: https://github.com/grtjn/ml-unique#how-it-works – grtjn

उत्तर

2

कुछ दर्द के बाद पर MarkLogic 9 का उपयोग करें, मुझे लगता है कि कारण मैं इस त्रुटि प्राप्त की खोज की। ऐसा प्रतीत होता है क्योंकि यह वास्तव में निर्देशिका "/" पर एक ताला लगा था और यह लॉक लेनदेन लॉक नहीं है।

प्रति documentation रूप में, यह, एक लगातार ताला कि WebDAV server.I वास्तव में शक था कि WebDAV से संबंधित हो सकती है और मैं डेटाबेस पर WebDAV सेवाएं अक्षम ने अधिग्रहण कर लिया है यह सोचते हैं कि किसी भी ताले को रिहा उन सेवाओं पकड़ होगा और मैं qconsole का उपयोग कर डॉक्टर को लिखने में सक्षम था।

ऐसा प्रतीत होता है कि व्यवस्थापक खाते को वेबडावी सर्वर द्वारा बनाए गए उन लगातार ताले को अनदेखा करने का अधिकार है ताकि फ़ंक्शन उस संदर्भ से काम करता है और अक्षम करने वाला वेबडावी सर्वर लगातार लॉक जारी नहीं करेगा।

तो, समस्या को हल करने के लिए मुझे बस इतना करना था कि मैं वेबएडीवी सर्वर को अक्षम करने के बाद चारों ओर लटक रहे ताले को छोड़ना था।

बाद में, मैंने वेबडैव सर्वर को फिर से सक्षम किया और फ़ंक्शन ठीक काम करना जारी रखता है, इसका मतलब यह होगा कि वीवीडीवी सर्वर केवल कुछ स्थितियों के तहत ताले प्राप्त करता है जो दस्तावेज नहीं है।

मैंने सोचा, मुझे लगता है कि एक ही समस्या

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