2012-08-23 10 views
9

मैं PHP की mysqli लाइब्रेरी का उपयोग कर रहा हूं। डेटाबेस आवेषण और अद्यतन हमेशा एक प्रयास-पकड़ ब्लॉक में होते हैं। प्रत्येक क्वेरी की सफलता तुरंत जांच की जाती है (if $result === false), और कोई भी विफलता अपवाद फेंकता है। पकड़ mysqli_rollback() पर कॉल करता है और उपयोगकर्ता के लिए एक संदेश के साथ बाहर निकलता है।PHP और MySQL के साथ, क्या आपको रोलबैक विफलताओं की जांच करनी चाहिए?

मेरा सवाल है, क्या मुझे mysqli_rollback() के वापसी मूल्य की जांच करना चाहिए? यदि ऐसा है, और रोलबैक विफल रहता है, तो कोड को कौन से कार्यों को लेना चाहिए?

मुझे यह समझने में कठिनाई होती है कि रोलबैक कैसे विफल हो सकता है (MySQL में कुछ अत्याचारी बग को छोड़कर)। और चूंकि PHP किसी भी तरह से बाहर निकलने जा रहा है, रोलबैक को कॉल करना लगभग अनिवार्य लगता है। मुझे निश्चित रूप से लगता है कि यह स्पष्टता के लिए कोड में होना चाहिए, लेकिन जब PHP बाहर निकलता है तो यह MySQL से कनेक्शन बंद कर देगा और असामान्य लेन-देन स्वचालित रूप से वापस आ जाएंगे।

+2

यदि आप यथार्थवादी संभावना के साथ एक ठोस उदाहरण की तलाश में हैं- आपका PHP डेटाबेस पर चलने की तुलना में एक अलग मशीन पर निष्पादित हो सकता है (उदाहरण के लिए, अलग डेटाबेस सर्वर)। नेटवर्क आईओ में बहुत सारे काम हैं लेकिन अब अगले दूसरे काम नहीं करते हैं। बेशक यह एक ही मशीन पर दोनों के साथ भी हो सकता है, बस बहुत कम संभावना है। – goat

+0

दिलचस्प! ऐसा लगता है कि प्रभाव उस परिदृश्य में समान हैं हालांकि: रोलबैक कॉल विफल होने पर भी, PHP का MySQL क्लाइंट सत्र समाप्त हो जाएगा और रोलबैक होगा। तो शायद बड़ी समस्याओं के संकेतक के रूप में त्रुटि लॉगिंग करने लायक है, लेकिन आपको अभी भी डेटा अखंडता के बारे में चिंता करने की ज़रूरत नहीं है। – giskard22

उत्तर

4

यदि रोलबैक विफल रहता है (उदाहरण के लिए कनेक्शन विफलता), कनेक्शन को बंद करने के बाद परिवर्तनों को रोलबैक किया जाएगा, इसलिए आपको त्रुटि को संभालने की आवश्यकता नहीं है। जब आप लेनदेन में होते हैं, जब तक कि आपके पास स्पष्ट प्रतिबद्धता न हो (या आप ऑटोोकॉमिट मोड में चल रहे हैं, जिसका अर्थ है कि आप प्रत्येक कथन के बाद प्रतिबद्ध हैं), लेनदेन वापस रोल किया जा रहा है।

एक सत्र कि स्पष्ट रूप से अंतिम लेन-देन करने के बिना विकलांग समाप्त होता है autocommit है, MySQL कि लेनदेन वापस रोल है।

रोलबैक त्रुटि को संभालने का एकमात्र मामला यह है कि यदि आप अपनी स्क्रिप्ट से बाहर नहीं निकल रहे हैं, लेकिन बाद में एक नया लेनदेन शुरू कर रहे हैं, क्योंकि लेनदेन शुरू करने से वर्तमान में वर्तमान में प्रतिबद्धता होगी। Statements That Cause an Implicit Commit

+0

यही मुझे लगा। मुझे उन बयानों से अवगत नहीं था जो अंतर्निहित प्रतिबद्धता का कारण बनते हैं, इसलिए धन्यवाद! वैसे, उस जानकारी के लिए एक बेहतर लिंक शायद [स्टेटमेंट्स जो एक लागू प्रतिबद्धता का कारण बनता है] (http://dev.mysql.com/doc/refman/5.1/en/implicit-commit.html) – giskard22

0

mysqli_rollback विफल हो सकता है यदि आप डेटाबेस से जुड़े नहीं थे (कभी नहीं थे)। पहले से ही आपके त्रुटि-हैंडलिंग पर निर्भर करता है।

संबंधित मुद्दे