समस्या यह है कि आप यह सुनिश्चित करने के लिए MySQL स्तर लॉकिंग का उपयोग करने का प्रयास कर रहे हैं कि टिकट एक से अधिक व्यक्तियों को नहीं सौंपा जा सकता है। इस तरह यह पता लगाने का कोई तरीका नहीं है कि उपयोगकर्ता द्वारा टिकट को लॉक किया गया है या नहीं।
मैं टिकट तालिका में 2 लॉक संबंधित फ़ील्ड जोड़कर एक एप्लिकेशन स्तर लॉक लागू करूंगा:एक टाइमस्टैम्प जब लॉक लगाया गया था और एक उपयोगकर्ता आईडी फ़ील्ड आपको बता रहा था कि कौन सा उपयोगकर्ता लॉक रखता है। लॉक से संबंधित फ़ील्ड को किसी अन्य टेबल में रखा जा सकता है (उदाहरण के लिए, इस उद्देश्य के लिए शॉपिंग कार्ट का उपयोग किया जा सकता है)।
जब कोई उपयोगकर्ता टिकट का चयन करता है, तो आप इन लॉक फ़ील्ड को सशर्त अपडेट स्टेटमेंट के साथ अपडेट करने का प्रयास करते हैं:
update tickets
set lock_time=now(), lock_user=...
where ticket_id=... and lock_time is null
...
. के स्थान पर मान आपके आवेदन द्वारा आपूर्ति की जाती है। lock_time is null
यह सुनिश्चित करने के लिए मानदंड हैं कि यदि टिकट पहले से ही किसी अन्य उपयोगकर्ता द्वारा चुना गया है, तो बाद वाला उपयोगकर्ता लॉक को ओवरराइड नहीं करता है। अद्यतन विवरण के बाद प्रभावित पंक्तियों की संख्या की जाँच करें। यदि यह एक है, तो वर्तमान उपयोगकर्ता ने लॉक प्राप्त कर लिया है। अगर यह 0 है, तो किसी और ने टिकट लॉक कर दिया है।
यदि आपके पास किसी अन्य तालिका में लॉकिंग डेटा है, तो उस तालिका में टिकट आईडी फ़ील्ड पर एक अद्वितीय प्रतिबंध लगाएं और लॉक प्राप्त करने के लिए सम्मिलित करें का उपयोग करें। यदि इंसर्ट सफल होता है, तो लॉक का अधिग्रहण किया जाता है। यदि यह विफल रहता है, तो दूसरे उपयोगकर्ता ने टिकट लॉक कर दिया है।
लॉक आमतौर पर कई मिनटों के लिए आयोजित किया जाता है, उसके बाद आपके एप्लिकेशन को लॉक जारी करना होगा (लॉकिंग फ़ील्ड को शून्य पर सेट करें या अन्य तालिका से लॉकिंग रिकॉर्ड हटाएं)।