MySQL
कॉलर को त्रुटि कोड पास करता है और इस त्रुटि कोड के आधार पर कॉलर यह तय करने के लिए स्वतंत्र है कि क्या वह इस समय तक किए गए कार्य को करना चाहता है (इस विशेष के साथ त्रुटि को अनदेखा करना INSERT
स्टेटमेंट) या लेन-देन को रोलबैक करने के लिए।
यह PostgreSQL
के विपरीत है जो हमेशा त्रुटि पर लेन-देन को रोकता है और यह व्यवहार कई समस्याओं का स्रोत है।
अपडेट करें:
बिना शर्त ROLLBACK
. का उपयोग करना एक बुरा अभ्यास है संग्रहित प्रक्रियाओं के अंदर।
संग्रहीत कार्यविधियाँ स्टैकेबल हैं और लेन-देन नहीं हैं, इसलिए एक ROLLBACK
एक नेस्टेड संग्रहीत कार्यविधि के भीतर लेन-देन की शुरुआत में वापस रोल हो जाएगा, संग्रहीत कार्यविधि निष्पादन की स्थिति में नहीं।
यदि आप त्रुटियों पर डेटाबेस स्थिति को पुनर्स्थापित करने के लिए लेनदेन का उपयोग करना चाहते हैं, तो SAVEPOINT
. का उपयोग करें निर्माण और DECLARE HANDLER
सेवपॉइंट पर वापस जाने के लिए:
CREATE PROCEDURE prc_work()
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK TO sp_prc_work;
SAVEPOINT sp_prc_work;
INSERT …;
INSERT …;
…
END;
किसी भी इंसर्ट में विफलता प्रक्रिया द्वारा किए गए सभी परिवर्तनों को वापस ले लेगी और इससे बाहर निकल जाएगी।