Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

अप्सर्ट का संस्करण चुनें/सम्मिलित करें:क्या उच्च संगामिति के लिए कोई डिज़ाइन पैटर्न है?

चीजों को सीरियल करने योग्य बनाने के लिए आप लॉक का उपयोग कर सकते हैं लेकिन इससे समेकन कम हो जाता है। "उपचारात्मक" कार्रवाई के सुरक्षित संचालन के बाद पहले सामान्य स्थिति ("ज्यादातर सम्मिलित करें या अधिकतर चयन करें") का प्रयास क्यों न करें? यानी "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 का उपयोग करने में सक्षम होने के लिए।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. पिवट टेबल और समवर्ती कॉलम

  2. freeTDS अपने कॉन्फिग का उपयोग नहीं कर रहा है

  3. किसी SQL से बेस डेटा प्रकार लौटाएं_SQL सर्वर में भिन्न मान

  4. SQL सर्वर (T-SQL) में अनुलग्नक के रूप में क्वेरी परिणाम ईमेल कैसे करें

  5. SQL सर्वर में केवल संख्यात्मक मान कैसे लौटाएं?