आपको यह सुनिश्चित करने के लिए लेन-देन में ऐसा करने की आवश्यकता है कि दो एक साथ क्लाइंट एक ही फ़ील्ड को दो बार सम्मिलित नहीं करेंगे:
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 को लॉक करने का कारण नहीं बनता है। रिपीटेबल रीड्स के साथ लेन-देन रिकॉर्ड को लॉक कर देता है (यदि पाया जाता है) लेकिन गैप नहीं।