यह पीडीओ की गलती नहीं है, यह पोस्टग्रेएसक्यूएल के लेनदेन प्रबंधन में निहित है। देखें:
- मैं PostgreSQL को कैसे कह सकता हूं कि जब एक भी बाधा विफल हो जाए तो पूरे लेनदेन को रद्द न करें?ए>
- क्या मैं Postgresql से लेन-देन में त्रुटियों को अनदेखा करने के लिए कह सकता हूं
- लेनदेन में त्रुटि के बाद रोलबैक
PostgreSQL लेन-देन को वापस रोल नहीं करता है, लेकिन यह इसे एक निरस्त स्थिति में सेट करता है जहां यह केवल वापस रोल कर सकता है, और जहां ROLLBACK
को छोड़कर सभी कथन त्रुटि की रिपोर्ट करें:
(मुझे आश्चर्य है कि आधिकारिक दस्तावेज़ीकरण में इसका उल्लेख नहीं है; मुझे लगता है कि मुझे इसे सुधारने के लिए एक पैच लिखने की आवश्यकता होगी।)
इसलिए। जब आप पीडीओ में अपवाद को पकड़ने/पकड़ने की कोशिश करते हैं, तो आप एक PHP-साइड अपवाद को फँसा रहे होते हैं, लेकिन आप इस तथ्य को नहीं बदल रहे हैं कि PostgreSQL लेनदेन एक निरस्त स्थिति में है।
यदि आप अपवादों को निगलने और लेन-देन का उपयोग जारी रखने में सक्षम होना चाहते हैं, तो आपको एक SAVEPOINT
प्रत्येक कथन से पहले जो विफल हो सकता है। यदि यह विफल हो जाता है, तो आपको ROLLBACK TO SAVEPOINT ...;
. यदि यह सफल होता है तो आप RELEASE SAVEPOINT ...;
. कर सकते हैं . यह लेनदेन प्रबंधन के लिए डेटाबेस पर अतिरिक्त ओवरहेड लगाता है, राउंड-ट्रिप जोड़ता है, और लेनदेन आईडी के माध्यम से तेजी से जलता है (जिसका अर्थ है कि PostgreSQL को अधिक पृष्ठभूमि सफाई कार्य करना है)।
इसके बजाय अपने SQL को डिज़ाइन करना आम तौर पर बेहतर होता है, इसलिए यह सामान्य परिस्थितियों में विफल नहीं होगा। उदाहरण के लिए, आप क्लाइंट-साइड की अधिकांश त्रुटियों को ट्रैप करते हुए सर्वर साइड की बाधाओं को दूसरे स्तर के आश्वासन के रूप में मानते हुए क्लाइंट-साइड को मान्य कर सकते हैं।
जहां यह अव्यावहारिक है, वहां अपने आवेदन को दोष सहिष्णु बनाएं, ताकि यह एक असफल लेनदेन का पुन:प्रयास कर सके। कभी-कभी यह वैसे भी आवश्यक है - उदाहरण के लिए, आप आम तौर पर गतिरोध लेनदेन बंद होने या क्रमांकन विफलताओं से उबरने के लिए सेवपॉइंट का उपयोग नहीं कर सकते हैं। विफलता-प्रवण लेन-देन को यथासंभव छोटा रखना, केवल आवश्यक न्यूनतम कार्य करना भी उपयोगी हो सकता है, इसलिए आपके पास ट्रैक रखने और दोहराने के लिए कम है।
तो:जहां संभव हो, अपवाद को निगलने के बजाय, विफलता-प्रवण डेटाबेस कोड को पुनः प्रयास लूप में चलाएं। सुनिश्चित करें कि आपका कोड उस जानकारी का रिकॉर्ड रखता है जिसकी उसे त्रुटि होने पर पूरे लेन-देन का पुन:प्रयास करने की आवश्यकता है, न कि केवल सबसे हाल का विवरण।
याद रखें, कोई भी लेन-देन विफल हो सकता है:डीबीए पैच लागू करने के लिए डेटाबेस को पुनरारंभ कर सकता है, एक भगोड़ा क्रॉन जॉब के कारण सिस्टम रैम से बाहर हो सकता है, आदि। इसलिए विफलता सहनशील ऐप्स वैसे भी एक अच्छा डिज़ाइन हैं।
कम से कम पीडीओ अपवादों का उपयोग करने और अपवादों को संभालने के लिए आपको सहारा देता है - आप पहले से ही अधिकांश देवों से आगे हैं।