आप चीजों को सरल बनाने के लिए LOCK का उपयोग कर सकते हैं लेकिन यह समरूपता को कम करता है। "सामान्य उपचार" की सुरक्षित संचालन के बाद पहले सामान्य स्थिति को क्यों न करें ("ज्यादातर डालें या अधिकतर चुनें")? यही कारण है कि, "JFDI" पैटर्न ... है
अधिकतर आवेषण (गेंद पार्क 70-80% +) की उम्मीद:
बस सम्मिलित करने के लिए प्रयास करें। यदि यह विफल रहता है, तो पंक्ति पहले से ही बनाई जा चुकी है। समवर्तीता के बारे में चिंता करने की आवश्यकता नहीं है क्योंकि TRY/CATCH आपके लिए डुप्लीकेट से संबंधित है।
BEGIN TRY
INSERT Table VALUES (@Value)
SELECT @id = SCOPEIDENTITY()
END TRY
BEGIN CATCH
IF ERROR_NUMBER() <> 2627
RAISERROR etc
ELSE -- only error was a dupe insert so must already have a row to select
SELECT @id = RowID FROM Table WHERE RowValue = @VALUE
END CATCH
अधिकतर का चयन करता है:
इसी प्रकार, लेकिन पहले डेटा प्राप्त करने की कोशिश। कोई डेटा = INSERT की आवश्यकता नहीं है। दोबारा, यदि 2 समवर्ती कॉल INSERT को आज़माएं क्योंकि वे दोनों को TRY/CATCH हैंडल गायब होने वाली पंक्ति मिली।
BEGIN TRY
SELECT @id = RowID FROM Table WHERE RowValue = @VALUE
IF @@ROWCOUNT = 0
BEGIN
INSERT Table VALUES (@Value)
SELECT @id = SCOPEIDENTITY()
END
END TRY
BEGIN CATCH
IF ERROR_NUMBER() <> 2627
RAISERROR etc
ELSE
SELECT @id = RowID FROM Table WHERE RowValue = @VALUE
END CATCH
दूसरा वाला खुद को दोहराने लगता है, लेकिन यह अत्यधिक समवर्ती है। ताले ही लेकिन संगामिति की कीमत पर प्राप्त होगा ...
संपादित करें:
क्यों मर्ज का उपयोग नहीं ...
आप आउटपुट खंड यह केवल वापस आ जाएगी का उपयोग करते हैं क्या अपडेट किया गया है। तो आपको OUTPUT क्लॉज के लिए अंतर्निहित तालिका उत्पन्न करने के लिए एक डमी अद्यतन की आवश्यकता है। यदि आपको कई कॉल (जैसे ओपी द्वारा निहित) के साथ डमी अपडेट करना है, तो बहुत सारे लॉग मेरिज का उपयोग करने में सक्षम होने के लिए लिखते हैं।
यह इसी प्रकार है: http://stackoverflow.com/questions/13540/insert-update-stored-proc-on-sql-server/193876#193876 –
मैं सहमत हूं कि यह समान है, लेकिन मैं कहूंगा कि अंतर है कि अद्यतन की कोई आवश्यकता नहीं है, बस एक डालने या चयन कथन।आपके उत्तर में, आप संयुक्त संकेत के रूप में सर्जिकलबल का उपयोग करते हैं। क्या यह उपरोक्त क्वेरी पर उपरोक्त क्वेरी के लिए आपकी सिफारिश होगी? – 8kb
सीरियलज़ेबल संकेत के साथ एक सम्मिलित करें, संभावित रूप से लेनदेन में चाल चलनी चाहिए। मैं एक उत्तर लिखने की कोशिश कर सकता हूं लेकिन यह आईपैड मुझे ध्वनि ब्रश बनाता है :( –