2009-10-27 17 views
9

जब एक mysql innodb लेनदेन में, मैं एक डुप्लिकेट कुंजी त्रुटि रोलबैक का कारण बनने की अपेक्षा करता हूं। ऐसा नहीं करता है, इसके बजाय यह केवल एक त्रुटि फेंकता है और अगले आदेश पर जारी है। एक बार COMMIT कमांड पहुंचने के बाद, लेनदेन किया जाएगा, डुप्लिकेट कुंजी कमांड का कारण बनता है।डुप्लिकेट कुंजी त्रुटि रद्द/रोलबैक mysql लेनदेन

इस अपेक्षित व्यवहार है? यदि हां, तो कोई इसे स्थापित करने के बारे में कैसे जायेगा ताकि लेन-देन को तब किया जा सके जब ऐसी त्रुटि होती है?

परीक्षण वातावरण:

CREATE TABLE `test` ( 
    `id` int(11) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 

BEGIN; 
    INSERT INTO test VALUES (5); 
    INSERT INTO test VALUES (5); 
COMMIT; 

अपेक्षित परिणाम: एक डालने डुप्लिकेट की वजह से विफल रहता है तालिका test मूल्य 5

+0

इन्हें भी देखें:: http://dev.mysql.com/doc/refman/5.0/en/innodb-error-handling

आपको एक त्रुटि हैंडलर है कि लेनदेन रोलबैक होगा घोषित करने के लिए है। एचटीएमएल –

उत्तर

3

MySQL (और अन्य एसक्यूएल इंजन AFAIK) कोई त्रुटि होने पर स्वचालित रूप से लेनदेन को रोलबैक नहीं करता है।

DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING, NOT FOUND 
BEGIN 
    ROLLBACK; 
    CALL ERROR_ROLLBACK_OCCURRED; 
END; 
8

के साथ एक रिकॉर्ड होता है,: तालिका test खाली

वास्तविक परिणाम है डेटाबेस उस लेन-देन की शुरुआत में लेनदेन को वापस ले जाता है।

यह कथन की शुरुआत में किए गए आंतरिक बचत बिंदु का उपयोग करता है, फिर उस सहेजने के बिंदु पर वापस रोल करता है।

यह पूरे लेनदेन को वापस नहीं लाता है, क्योंकि शायद वह नहीं हो सकता था जो आप चाहते थे।

mysql क्लाइंट का व्यवहार कमांड लाइन पैरामीटर का उपयोग कर कॉन्फ़िगर करने योग्य है। यह या तो छोड़ सकता है (जो निश्चित रूप से रोलबैक होगा) या जारी रखें।

यदि आप अपना ऐप उपयोग कर रहे हैं, तो यह आपके ऊपर क्या है।


माईस्कल विफलताओं को संभालने के तरीके पर नीति लागू नहीं करता है - यह आपके आवेदन पर छोड़ देता है। तो आप उनके बारे में क्या करते हैं वह आपका व्यवसाय है - यदि आप चाहें तो उन्हें अनदेखा कर सकते हैं।

+2

मैं आपको 100 प्रतिनिधि बिंदुओं के लिए देना चाहता हूं "माईएसक्ल आप विफलताओं को संभालने के तरीके पर नीति लागू नहीं करते हैं - यह आपके आवेदन पर छोड़ देता है। तो आप उनके बारे में क्या करते हैं, यह आपका व्यवसाय है - यदि आप चाहें तो उन्हें अनदेखा कर सकते हैं । " – longneck

+0

तो क्या लेनदेन स्थापित करने का कोई तरीका है, इसलिए यह स्वचालित रूप से डुप्लिकेट कुंजी त्रुटि पर वापस रोल करता है? या क्या मुझे प्रत्येक क्वेरी के परिणाम की निगरानी करनी है और फिर इस व्यवहार को पाने के लिए स्पष्ट रूप से वापस रोल करना है? – allixsenos

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