मान लीजिए कि आपके पास निम्नलिखित कोड हैं (कृपया ध्यान दें कि यह बहुत ही भयानक है):
BEGIN TRAN;
DECLARE @id int
SELECT @id = id + 1 FROM TableA;
UPDATE TableA SET id = @id; --TableA must have only one row, apparently!
COMMIT TRAN;
-- @id is returned to the client or used somewhere else
मेरी नजर में, यह ठीक से संगामिति का प्रबंधन नहीं कर रहा है। सिर्फ इसलिए कि आपके पास एक लेन-देन है, इसका मतलब यह नहीं है कि आपके अपडेट स्टेटमेंट में आने से पहले कोई और उस मूल्य को नहीं पढ़ेगा जो आपने किया था।
अब, जैसा कि कोड को छोड़ रहा है (मुझे पता है कि यह एक एकल कथन के रूप में बेहतर तरीके से या यहां तक कि एक ऑटोइन्क्रिमेंट / पहचान कॉलम का उपयोग करके बेहतर तरीके से नियंत्रित किया जाता है) क्या हैं यह सुनिश्चित करने के तरीके कि इसे सही ढंग से संभालना है और दौड़ की स्थिति को रोकना है जो दो ग्राहकों को समान करने की अनुमति देता है आईडी मूल्य?
मुझे पूरा यकीन है कि WITH (UPDLOCK, HOLDLOCK)
SELECT में A जोड़ने से ट्रिक आ जाएगी। Serializable लेनदेन अलगाव स्तर के रूप में अच्छी तरह से काम करने लगता है के बाद से यह इनकार करते हैं किसी और जब तक ट्रॅन खत्म हो गया है आप क्या किया पढ़ने के लिए ( अद्यतन :। यह झूठ है मार्टिन देखें जवाब)। क्या यह सच है? क्या वे दोनों समान रूप से अच्छी तरह से काम करेंगे? क्या एक को दूसरे पर पसंद किया जाता है?
एक आईडी अपडेट की तुलना में कुछ अधिक वैध करने की कल्पना करें - एक रीड पर आधारित कुछ गणना जो आपको अपडेट करने की आवश्यकता है। इसमें कई टेबल शामिल हो सकते हैं, जिनमें से कुछ आप लिखेंगे और दूसरे वे जिन्हें आप नहीं करेंगे। यहां सबसे अच्छा अभ्यास क्या है?
इस प्रश्न को लिखने के बाद, मुझे लगता है कि लॉक संकेत बेहतर हैं क्योंकि तब आप केवल उन तालिकाओं को लॉक कर रहे हैं जिनकी आपको आवश्यकता है, लेकिन मैं किसी के इनपुट की सराहना करूंगा।
पुनश्च और नहीं, मैं सबसे अच्छा जवाब नहीं जानता और वास्तव में एक बेहतर समझ प्राप्त करना चाहता हूं! :)
update
जो अप्रचलित डेटा पर आधारित हो सकते हैं? यदि बाद में, आप यहrowversion
जांचने के लिए कॉलम का उपयोग कर सकते हैं कि क्या अद्यतन होने के बाद से पंक्ति को बदला नहीं गया है।