मेरे पास एक ऐसा फ़ंक्शन है जिसे मैंने अनुक्रमिक संख्या की पीढ़ी के लिए लिखा था। समारोह इस प्रकार है:कोई ताले मौजूद नहीं होने पर 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 प्रोग्राम कैसे निष्पादित करता है इस पर कोई दस्तावेज?
धन्यवाद एक बहुत
लालकृष्ण
पुनश्च: मैं एक विंडोज़ सर्वर
वहाँ किसी भी संभावना है कि समारोह एक बार से अधिक लागू हो जाता है है देख सकते हैं दूसरों की मदद करने के लिए इस जानकारी साझा करना चाहिए? साथ ही, आप ' अलग-अलग लेनदेन ' में पास करना चाहेंगे। यह invoke और eval के लिए डिफ़ॉल्ट नहीं है। –
grtjn
@grtjn: मैंने वास्तव में कुछ अलग अलगाव विकल्पों के साथ परीक्षण किया; उनमें से कोई भी काम नहीं करता है।यह भी प्रतीत होता है कि अलग-अलग लेन-देन डिफ़ॉल्ट विकल्प है, जैसा कि qconsole में फ़ंक्शन के सही निष्पादन द्वारा सिद्ध किया गया था। और, कोई अन्य कॉल नहीं है: यह सुनिश्चित करने के लिए कि मैंने सेवा कोड में हर दूसरे कॉल को हटा दिया है और केवल इस फ़ंक्शन पर कॉल छोड़ दिया है –
वैसे, क्या आपने इसके बजाय यादृच्छिक आईडी का उपयोग करने पर विचार किया है? अनुक्रमिक आईडी के ऊपर पसंद करने के अच्छे कारण हैं। विवरण के लिए यहां देखें: https://github.com/grtjn/ml-unique#how-it-works – grtjn