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

यदि मौजूद है, तो अन्य सम्मिलित करें चुनें और फिर चुनें

आपको यह सुनिश्चित करने के लिए लेन-देन में ऐसा करने की आवश्यकता है कि दो एक साथ क्लाइंट एक ही फ़ील्ड को दो बार सम्मिलित नहीं करेंगे:

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRANSACTION
    DECLARE @id AS INT
    SELECT @id = tableId FROM table WHERE [email protected]
    IF @id IS NULL
    BEGIN
       INSERT INTO table (fieldValue) VALUES (@newValue)
       SELECT @id = SCOPE_IDENTITY()
    END
    SELECT @id
COMMIT TRANSACTION

आप डबल-चेक्ड लॉकिंग का भी उपयोग कर सकते हैं लॉकिंग ओवरहेड को कम करने के लिए

DECLARE @id AS INT
SELECT @id = tableID FROM table (NOLOCK) WHERE [email protected]
IF @id IS NULL
BEGIN
    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
    BEGIN TRANSACTION
        SELECT @id = tableID FROM table WHERE [email protected]
        IF @id IS NULL
        BEGIN
           INSERT INTO table (fieldValue) VALUES (@newValue)
           SELECT @id = SCOPE_IDENTITY()
        END
    COMMIT TRANSACTION
END
SELECT @id

जब आप एक क्रमिक लेन-देन के अंदर होते हैं, तो आइसोलेशन लेवल सीरियल की आवश्यकता क्यों होती है, पहला चयन जो तालिका को हिट करता है, उस स्थान को कवर करने वाला एक रेंज लॉक बनाता है जहां रिकॉर्ड होना चाहिए, इसलिए जब तक यह लेनदेन समाप्त नहीं हो जाता तब तक कोई भी उसी रिकॉर्ड को सम्मिलित नहीं कर सकता है।

Isolation LEVEL SERIALIZABLE के बिना, डिफ़ॉल्ट आइसोलेशन लेवल (READ COMMITTED) रीड टाइम पर टेबल को लॉक नहीं करेगा, इसलिए SELECT और UPDATE के बीच, कोई अभी भी सम्मिलित करने में सक्षम होगा। READ COMMITTED आइसोलेशन स्तर के साथ लेन-देन SELECT को लॉक करने का कारण नहीं बनता है। रिपीटेबल रीड्स के साथ लेन-देन रिकॉर्ड को लॉक कर देता है (यदि पाया जाता है) लेकिन गैप नहीं।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. मैं SQL सर्वर 2008 प्रबंधन स्टूडियो में टेक्स्ट या वर्कर (MAX) कॉलम की पूरी सामग्री कैसे देखूं?

  2. क्या बहुत सारे वामपंथी एक कोड गंध में शामिल होते हैं?

  3. SQL सर्वर ट्रिगर - निष्पादन का क्रम

  4. SQL केवल तभी फ़िल्टर जोड़ें जब कोई चर रिक्त न हो

  5. SQL सर्वर में किसी तालिका के लिए सभी जाँच और विदेशी कुंजी बाधाओं को कैसे अक्षम करें (T-SQL उदाहरण)