एक सरल समाधान जिसे मैंने एक आवेदन में लागू किया ....
CREATE TABLE RecordLocks(
[RecordId] [varchar](8) NOT NULL,
[UserName] [varchar](100) NOT NULL,
[datetimestamp] [smalldatetime] NOT NULL,
[PC] [varchar](100) NOT NULL
)
GO
datetimestamp
GetDate()
. का डिफ़ॉल्ट है RecordId
एक VARCHAR
है तालिका में प्राथमिक कुंजी के कारण मैं लॉक कर रहा हूं (मेरी पसंद नहीं)। साथ ही इस तालिका में स्पष्ट सूचकांक हैं
CREATE PROCEDURE usp_LockRecord @RecordId VARCHAR(8), @UserName VARCHAR(100), @ComputerName VARCHAR(100)
AS
BEGIN
BEGIN TRAN;
DELETE FROM RecordLocks WHERE DATEDIFF(HOUR, datetimestamp, GETDATE()) > 2;
IF NOT EXISTS (Select * from RecordLocks WHERE RecordId = @RecordId)
INSERT INTO RecordLocks (RecordId, username, PC) VALUES (@RecordId, @UserName, @ComputerName);
Select * from RecordLocks WHERE RecordId = @RecordId;
COMMIT TRAN;
END
GO
पहले हटाएं और 2 घंटे से अधिक पुराने रिकॉर्ड करें (सूट में बदलें)
जांचें कि लॉक करने के लिए पहले से ही लॉक करने वाला कोई रिकॉर्ड नहीं है और यदि लॉक नहीं डाला गया है।
उस रिकॉर्ड आईडी के साथ रिकॉर्ड का चयन करें जिसमें हम रुचि रखते हैं।
फिर कॉलिंग कोड में यह देखने के लिए जांचें कि क्या लॉक सफल हुआ है। यदि उपयोगकर्ता नाम और पीसी चयन से वापस आ रहा है, तो लॉक में पारित डेटा सफल रहा। यदि उपयोगकर्ता नाम मेल खाता है लेकिन पीसी समान नहीं है तो उपयोगकर्ता के पास एक अलग मशीन पर रिकॉर्ड खुला है। यदि उपयोगकर्ता नाम किसी अन्य उपयोगकर्ता से मेल नहीं खाता है तो यह पहले से ही खुला है। मैं उपयोगकर्ता को एक संदेश प्रदर्शित करता हूं यदि इसका असफल I.E यह रिकॉर्ड वर्तमान में कार्य केंद्र XYZ पर JoeB द्वारा बंद कर दिया गया है।
जब उपयोगकर्ता रिकॉर्ड सहेजता है या नेविगेट करता है तो बस रिकॉर्ड लॉक हटा दें।
मुझे यकीन है कि अन्य तरीके भी हैं लेकिन यह मेरे लिए अच्छा काम करता है।
अपडेट करें
एक रिकॉर्ड केवल तभी डाला जाएगा जब कोई मौजूद न हो। निम्नलिखित चयन एक रिकॉर्ड लौटाएगा। यदि उपयोगकर्ता नाम और/या पीसी उस डेटा से भिन्न है जिसे आप रिकॉर्ड डालने का प्रयास करते हैं तो पहले से ही किसी अन्य उपयोगकर्ता (या एक अलग मशीन पर एक ही उपयोगकर्ता) द्वारा लॉक किया गया है। तो एक कॉल सब कुछ करता है (ऐसा बोलने के लिए)। इसलिए अगर मैं Exec usp_LockRecord(1234, 'JoeB', 'Workstation1')
कॉल करता हूं तो और जो रिकॉर्ड मुझे वापस मिलता है वह उस डेटा से मेल खाता है जिसे मैंने सफलतापूर्वक उस रिकॉर्ड पर लॉक कर दिया है। यदि उपयोगकर्ता नाम और/या पीसी जो मैं वापस प्राप्त करता हूं वह अलग है तो रिकॉर्ड पहले ही लॉक हो चुका है। फिर मैं उपयोगकर्ता को एक संदेश प्रदर्शित कर सकता हूं कि रिकॉर्ड लॉक है, फ़ील्ड को केवल पढ़ने के लिए बनाएं, सहेजें बटन अक्षम करें और उन्हें बताएं कि अगर मैं चाहूं तो उस पर लॉक किसके पास है।