मुझे सिद्धांत के साथ एक पूरी तालिका (एक पंक्ति नहीं) को लॉक करने की आवश्यकता है, यदि संभव हो तो मैं मूल प्रश्नों के बिना ऐसा करना चाहता हूं।doctrine2 के साथ symfony2 में एक पूरी तालिका को कैसे लॉक करें?
pessimistic locking के लिए दस्तावेज़ केवल बताता है कि कैसे इन तरीकों के माध्यम से विशिष्ट संस्थाओं लॉक करने के लिए:
- EntityManager #
- EntityManager # ताला
- क्वेरी # setLockMode
मैं एक लेन-देन को खोजने जिसकी एक पंक्ति डालने की आवश्यकता है जिसका मूल्य तालिका में शेष पंक्तियों के मूल्यों पर निर्भर करता है, इसलिए मुझे दो लेनदेन को रोकने की आवश्यकता है उस टेबल पर एक ही समय में।
मैं स्पष्ट लेनदेन सीमांकन का उपयोग कर रहा हूं, जिसे लॉकिंग के साथ अच्छी तरह से काम करना चाहिए (ऊपर दिए गए दस्तावेज के अनुसार)।
नोट: इस मामले में आशावादी लॉकिंग पर्याप्त नहीं है, मैं लेनदेन को पुनः प्राप्त करने का जोखिम नहीं उठा सकता। क्वेरी के अलावा धीमा नहीं होना चाहिए, इसलिए प्रदर्शन कोई मुद्दा नहीं है।
संपादित करें: मैं एक उदाहरण दूंगा। कल्पना करें कि आप एक auto_increment बनाने के लिए हाथ बनाना चाहते हैं, और आपको अगले परिणाम को सम्मिलित करने के लिए पिछले परिणाम प्राप्त करने के लिए तालिका से अधिकतम() का चयन करना होगा। आपको यह सुनिश्चित करना होगा कि कोई भी दो लेन-देन एक ही मूल्य को सम्मिलित करने का प्रयास न करें, यदि वे एक ही समय में अधिकतम() का चयन करते हैं।
मैं इस समस्या का सामान्य समाधान ढूंढ रहा हूं, जब auto_increment अच्छा नहीं है, उदाहरण के लिए स्ट्रिंग्स, या एकाधिक कॉलम, हैंश या पिछले पंक्ति सेट पर जो भी गणना करना है, उसके साथ।
लॉकिंग एक ठोस समाधान है और आशावादी लॉकिंग के विपरीत, आपको त्रुटियों पर पुनः प्रयास करने की आवश्यकता नहीं है।
तो, क्या सिद्धांत में टेबल लॉकिंग का उपयोग करने का कोई तरीका है?
इमो बनाने के लिए आवश्यक किया गया था, एक बेहतर विकल्प एक सौदे को खोलने के लिए होगा: एक देशी अद्यतन का उपयोग करना मेरे लिए समस्या तय एक चयनित क्वेरी के माध्यम से आपको आवश्यक तालिका से डेटा प्राप्त करें, और फिर अद्यतन करें। – JamesHalsall
समस्या यह है कि यदि दूसरा लेनदेन पहले होता है तो पहले लेनदेन एक अवैध मूल्य डालेगा। दूसरे लेनदेन का नतीजा पहले भी द्वारा डाली गई पंक्ति पर निर्भर होना चाहिए। यही कारण है कि मुझे लॉकिंग की आवश्यकता है, लेन-देन उस तालिका के लिए ओवरलैप नहीं होना चाहिए। – Jens