एक ही रिकॉर्ड को एक साथ अद्यतन करने से 2 उपयोगकर्ताओं को रोकना - mysql, डेटाबेस, डिज़ाइन, समरूपता

मेरे पास एक टेबल है tbl_orders। इसका एक मात्रा क्षेत्र है quantity। मेरे आवेदन के कुछ हिस्से में मुझे मात्रा 1 से घटाना होगा।

मुझे पहले से ही पता है id रिकॉर्ड (क्लाइंट की ओर से उपलब्ध), इसलिए मैं एक अपडेट स्टेटमेंट जारी करता हूं:

UPDATE tbl_orders
SET quantity=quantity-1
WHERE id= 6

समस्या यह है कि यह क्वेरी दुर्घटनावश हो सकती हैसमवर्ती रूप से कई बार चलाएं। उदाहरण के लिए, 2 ग्राहक सेवा ऑपरेटर एक ही रिकॉर्ड को एक साथ अपडेट कर सकते हैं। इसका मतलब है कि मात्रा 2 से तब घट जाएगी जब इसे केवल एक बार घटाया जाना चाहिए।

मैंने एक लेनदेन में अद्यतन डालने की कोशिश की, लेकिनइसके परिणामस्वरूप केवल दूसरे लेनदेन में देरी हुई जब तक कि पहला प्रतिबद्ध नहीं हो गया। एक बार यह प्रतिबद्ध होने के बाद दूसरा अपडेट चला और रिकॉर्ड को फिर से घटाया।

यदि कोई रिकॉर्ड संशोधित कर रहा है, तो मैं यह कैसे सुनिश्चित कर सकता हूं कि अन्य प्रश्न विफल हो जाएं?

अद्यतन करें:

किसी अद्यतन के लिए मात्रा मान्य होने के लिएडेटाबेस में क्लाइंट का पक्ष समान था। उदाहरण के लिए यदि कोई उपयोगकर्ता अपने ब्राउज़र पर एक मात्रा 5 देखता है और इसे घटाना चाहता है, तो डेटाबेस में मूल्य समान होना चाहिए।

अद्यतन 2

I found a good explanation यहाँ दो सिद्धांत का उपयोग करके आशावादी लॉकिंग के लिए:

उत्तर:

जवाब के लिए 5 № 1

एक दृष्टिकोण जो मैंने अतीत में इस्तेमाल किया / देखा थाटाइमस्टैम्प कॉलम होना। क्वेरी करते समय, सुनिश्चित करें कि आपके पास रिकॉर्ड संपादित करने की शुरुआत में आईडी और मूल टाइमस्टैम्प दोनों हैं। फिर, जब आप अपडेट करने का प्रयास कर रहे हों, तब भेजें

update YourTable
set counter = counter -1,
TheTimestampColumn = new timestamp value
where ID = yourID
and TheTimeStampColumn = timeStampEditStartedWith

इस तरह, जो कोई भी इसके साथ पहले हो जाता हैमूल शुरुआती टाइमस्टैम्प जीत जाएगा। निम्नलिखित में से एक के लिए, आपको ट्रैक करना होगा कि कितने रिकॉर्ड अपडेट किए गए थे, और यदि वह गणना शून्य के बराबर है, तो आप उपयोगकर्ता को सूचित करेंगे कि किसी अन्य व्यक्ति ने रिकॉर्ड को तब बदल दिया था जब आप उसे देख रहे थे। क्या आप नवीनतम डेटा को पुनः लोड करना चाहते हैं? (या कुछ इस तरह का)।


संबंधित सवाल
सबसे लोकप्रिय