चीजों को सीरियल करने योग्य बनाने के लिए आप लॉक का उपयोग कर सकते हैं लेकिन इससे समेकन कम हो जाता है। "उपचारात्मक" कार्रवाई के सुरक्षित संचालन के बाद पहले सामान्य स्थिति ("ज्यादातर सम्मिलित करें या अधिकतर चयन करें") का प्रयास क्यों न करें? यानी "JFDI" पैटर्न...
अधिकतर INSERT अपेक्षित (बॉल पार्क 70-80%+):
बस डालने का प्रयास करें। यदि यह विफल रहता है, तो पंक्ति पहले ही बनाई जा चुकी है। समवर्ती के बारे में चिंता करने की कोई आवश्यकता नहीं है क्योंकि TRY/CATCH आपके लिए डुप्लिकेट से संबंधित है।
BEGIN TRY
INSERT Table VALUES (@Value)
SELECT @id = SCOPE_IDENTITY()
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 = SCOPE_IDENTITY()
END
END TRY
BEGIN CATCH
IF ERROR_NUMBER() <> 2627
RAISERROR etc
ELSE
SELECT @id = RowID FROM Table WHERE RowValue = @VALUE
END CATCH
दूसरा खुद को दोहराता हुआ प्रतीत होता है, लेकिन यह अत्यधिक समवर्ती है। ताले वही हासिल करेंगे लेकिन संगामिति की कीमत पर...
संपादित करें:
क्यों नहीं MERGE का उपयोग करने के लिए...
यदि आप OUTPUT क्लॉज का उपयोग करते हैं तो यह केवल वही लौटाएगा जो अपडेट किया गया है। तो आपको OUTPUT क्लॉज के लिए INSERTED टेबल जेनरेट करने के लिए एक डमी UPDATE की जरूरत है। यदि आपको कई कॉलों के साथ डमी अपडेट करना है (जैसा कि ओपी द्वारा निहित है) जो कि बहुत सारे लॉग लिखता है बस MERGE का उपयोग करने में सक्षम होने के लिए।