यदि आपको लेन-देन रोलबैक की आवश्यकता है, तो मैं रेडिस के अलावा किसी अन्य चीज़ का उपयोग करने की सलाह देता हूं। रेडिस लेनदेन अन्य डेटास्टोर के समान नहीं हैं। यहां तक कि मल्टी/एक्सेक भी आप जो चाहते हैं उसके लिए काम नहीं करता है - पहला क्योंकि कोई रोलबैक नहीं है। यदि आप रोलबैक चाहते हैं तो आपको दोनों सूचियों को नीचे खींचना होगा ताकि आप पुनर्स्थापित कर सकें - और आशा करते हैं कि हमारी त्रुटि स्थिति और "रोलबैक" के बीच किसी अन्य क्लाइंट ने भी सूचियों में से कोई भी संशोधित नहीं किया है। इसे एक समझदार और विश्वसनीय तरीके से करना न तो तुच्छ है और न ही सरल। यह शायद SO के लिए भी एक अच्छा प्रश्न नहीं होगा क्योंकि यह बहुत व्यापक होगा, और Redis विशिष्ट नहीं होगा।
अब EXEC ऐसा क्यों नहीं करता जो कोई सोच सकता है। आपके प्रस्तावित परिदृश्य में बहु/EXEC केवल के मामलों को संभालता है:
- आपने यह सुनिश्चित करने के लिए वॉच सेट की हैं कि कोई अन्य परिवर्तन नहीं हुआ है
- EXEC जारी करने से पहले आपके क्लाइंट की मृत्यु हो जाती है
- Redis स्मृति से बाहर है
EXEC कमांड जारी करने के परिणामस्वरूप त्रुटियाँ प्राप्त करना पूरी तरह से संभव है। जब आप EXEC जारी करते हैं, तो Redis सभी निष्पादित करेगा कतार में आदेश और त्रुटियों की एक सूची लौटाएं। यह ऐड-टू-लिस्ट-1 के काम करने और ऐड-टू-लिस्ट-2 के विफल होने की स्थिति प्रदान नहीं करेगा। आपके पास अभी भी आपकी दो सूचियाँ सिंक से बाहर होंगी। जब आप जारी करते हैं, तो MULTI जारी करने के बाद LPUSH कहें, आपको हमेशा एक OK
वापस मिलेगा। जब तक आप:
- a) पहले एक घड़ी जोड़ी और उस सूची में कुछ बदल गया या
- b) कतारबद्ध पुश कमांड के जवाब में Redis एक OOM शर्त लौटाता है
DISCARD काम नहीं करता जैसा कुछ लोग सोच सकते हैं। DISCARD का उपयोग के बजाय . किया जाता है EXEC, रोलबैक तंत्र के रूप में नहीं। एक बार जब आप EXEC जारी करते हैं तो आपका लेनदेन पूरा हो जाता है। Redis में कोई रोलबैक तंत्र बिल्कुल नहीं है - यही Redis के लेन-देन के बारे में नहीं है।
रेडिस लेनदेन को क्या कहता है, यह समझने की कुंजी यह महसूस करना है कि वे क्लाइंट कनेक्शन स्तर पर अनिवार्य रूप से एक कमांड कतार हैं। वे डेटाबेस स्टेट मशीन नहीं हैं।