नहीं, एकल SQL-विवरण विफल होने पर लेन-देन ट्रैक नहीं करता है।
यदि कोई एकल SQL-विवरण कथन विफल हो जाता है वापस लुढ़क गया है (जैसा कि @eggyal's Answer में वर्णित है) - लेकिन लेनदेन अभी भी खुला है। अगर आप commit
को कॉल करते हैं अब, सफल कथनों का कोई रोलबैक नहीं है और आपने अभी अपने डेटाबेस में "दूषित" डेटा डाला है। आप इसे आसानी से पुन:पेश कर सकते हैं:
m> CREATE TABLE transtest (id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL DEFAULT '',
CONSTRAINT UNIQUE KEY `uq_transtest_name` (name)) ENGINE=InnoDB;
Query OK, 0 rows affected (0.07 sec)
m> START TRANSACTION;
Query OK, 0 rows affected (0.00 sec)
m> INSERT INTO transtest (name) VALUE ('foo');
Query OK, 1 row affected (0.00 sec)
m> INSERT INTO transtest (name) VALUE ('foo');
ERROR 1062 (23000): Duplicate entry 'foo' for key 'uq_transtest_name'
m> INSERT INTO transtest (name) VALUE ('bar');
Query OK, 1 row affected (0.00 sec)
m> COMMIT;
Query OK, 0 rows affected (0.02 sec)
m> SELECT * FROM transtest;
+----+------+
| id | name |
+----+------+
| 3 | bar |
| 1 | foo |
+----+------+
2 rows in set (0.00 sec)
आप देखते हैं कि 'फू' और 'बार' का सम्मिलन सफल रहा, हालांकि दूसरा एसक्यूएल-स्टेटमेंट विफल रहा - आप यह भी देख सकते हैं कि AUTO_INCREMENT
-मान त्रुटिपूर्ण क्वेरी द्वारा बढ़ा दिया गया है।
इसलिए आपको प्रत्येक query
. के परिणामों की जांच करनी होगी -कॉल करें और यदि कोई विफल रहता है, तो rollback
पर कॉल करें अन्यथा सफल प्रश्नों को पूर्ववत करने के लिए। तो PHP-मैनुअल में लोरेंजो का कोड समझ में आता है।
एकमात्र त्रुटि जो MySQL को लेनदेन को वापस रोल करने के लिए मजबूर करती है वह एक "लेनदेन गतिरोध" है (और यह InnoDB के लिए विशिष्ट है, अन्य स्टोरेज इंजन उन त्रुटियों को अलग तरीके से संभाल सकते हैं)।