Một số câu lệnh (đáng chú ý nhất là DDL ) trong MySQL gây ra một cam kết ngầm trước đây chúng được thực thi và không thể quay lại - như vậy, điều này cũng ngăn các thay đổi DML trước đó không được khôi phục.
Các câu lệnh được liệt kê trong phần này (và bất kỳ từ đồng nghĩa nào với chúng) hoàn toàn kết thúc bất kỳ giao dịch nào đang hoạt động trong phiên hiện tại, như thể bạn đã thực hiện CAM KẾT trước khi thực hiện câu lệnh . Đối với MySQL 5.5.3, hầu hết các câu lệnh này cũng gây ra một cam kết ngầm sau khi thực thi; để biết thêm chi tiết, hãy xem phần cuối của phần này.
Kể từ ALTER TABLE
là một trong những câu lệnh bị ảnh hưởng, lô SQL được xử lý hiệu quả là:
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;
Giải pháp được đề xuất là tách DDL và DML . tài liệu nói:
Bạn nên thiết kế các giao dịch [DML] của mình để không bao gồm các câu lệnh [DDL] như vậy. Nếu bạn đưa ra một bản sao kê sớm trong một giao dịch mà không thể hoàn tác và sau đó một bản sao kê khác sau đó không thành công, thì hiệu lực đầy đủ của giao dịch sẽ không thể được khôi phục trong những trường hợp như vậy bằng cách đưa ra một câu lệnh ROLLBACK.