कुछ कथन (विशेष रूप से DDL ) MySQL में एक अंतर्निहित प्रतिबद्धता का कारण बनता है पहले उन्हें क्रियान्वित किया जाता है और वापस नहीं लाया जा सकता - इस तरह यह पहले के DML परिवर्तनों को भी वापस आने से रोकता है।
<ब्लॉकक्वॉट>इस खंड में सूचीबद्ध बयान (और उनके लिए कोई समानार्थी शब्द) वर्तमान सत्र में सक्रिय किसी भी लेनदेन को निहित रूप से समाप्त करते हैं, जैसे कि आपने कथन निष्पादित करने से पहले एक COMMIT किया था . MySQL 5.5.3 के अनुसार, इनमें से अधिकांश कथन भी निष्पादित करने के बाद एक अंतर्निहित प्रतिबद्धता का कारण बनते हैं; अतिरिक्त विवरण के लिए, इस अनुभाग का अंत देखें।
चूंकि ALTER TABLE
प्रभावित बयानों में से एक है, SQL बैच को प्रभावी ढंग से माना जाता है:
START TRANSACTION;
INSERT INTO `users` VALUES(NULL, 'User A', '[email protected]', '4', 'User A');
COMMIT; -- prevents ROLLBACK of insert(s), even if DDL fails
ALTER TABLE `users` CHANGE `level` `level` TINYINT(3) UNSIGNED NOT NULL;
सुझाया गया समाधान DDL और DML को अलग रखना है। . दस्तावेज़ीकरण कहते हैं:
<ब्लॉकक्वॉट>आपको अपने [DML] लेन-देनों को ऐसे [DDL] कथनों को शामिल न करने के लिए डिज़ाइन करना चाहिए। यदि आप किसी लेन-देन की शुरुआत में एक बयान जारी करते हैं जिसे रोलबैक नहीं किया जा सकता है, और फिर बाद में कोई अन्य कथन विफल हो जाता है, तो ऐसे मामलों में रोलबैक स्टेटमेंट जारी करके लेनदेन के पूर्ण प्रभाव को वापस नहीं लाया जा सकता है।