कारण WATCH
SE.Redis को एक ही कनेक्शन पर विभिन्न कॉल स्टैक से मल्टीप्लेक्स कमांड के लिए कैसे डिज़ाइन किया गया है, इसकी वजह से सीधे उजागर नहीं होता है। यह किसी भी लेन-देन कार्य के लिए बहुत . होना आवश्यक बनाता है कड़ाई से प्रबंधित।
मैं बिल्कुल स्पष्ट नहीं हूं कि "अपरिवर्तित" का उद्देश्य स्वयं में क्या होगा? , किसी ज्ञात मान की तुलना किए बिना - अन्यथा आप केवल दौड़ की स्थिति बना रहे हैं। इसके लिए समर्थन जोड़ना निश्चित रूप से संभव होगा, लेकिन मैं वास्तव में पहले अपेक्षित उपयोग-मामले को समझना चाहता हूं। क्या आप समझा सकते हैं?
अपना संपादन पुनः करें; आपका पसंदीदा उदाहरण (आखिरी वाला) बस संभव नहीं है रेडिस के साथ - एसई से कोई लेना-देना नहीं है। रेडिस; अगर आप GET
करते हैं एक MULTI
. के अंदर , आपको EXEC
. तक उत्तर नहीं मिलता है पूर्ण - इसलिए आप संभवतः SET
. में मान का उपयोग नहीं कर सकते :यह अभी तक उपलब्ध नहीं है ।
यदि यह मल्टीप्लेक्सिंग के लिए नहीं था, तो आप अपने दूसरे उदाहरण को फिर से ऑर्डर कर सकते हैं (SE.Redis क्या करता है के आधार पर) थोड़ा सा:
WATCH key
val = GET key
MULTI
val = val + 1
SET key $val
EXEC
यह सामान्य है WATCH
. का उपयोग :आप देखें जिन चीज़ों के बारे में आप पहले से पूछताछ कर रहे हैं, तो आप जानते हैं कि {key}
इस लूप के दौरान अपरिवर्तित है (या कम से कम, लेन-देन निरस्त हो जाएगा; कोई असंगत स्थिति नहीं)। हालांकि, WATCH
बहुसंकेतक के साथ अच्छा नहीं खेलता , यही वजह है कि SE.Redis आपको लेन-देन से पहले मूल्य प्राप्त करने के लिए बाध्य करता है , फिर आपको मान की तुलना करने की अनुमति देता है कि यह अपरिवर्तित है। वही परिणाम; थोड़ा अलग दृष्टिकोण, लेकिन यह बहुसंकेतक-सुरक्षित है। उस विषय पर अधिक जानकारी के लिए यहां देखें।