Beberapa pernyataan (terutama DDL ) di MySQL menyebabkan komit implisit sebelum mereka dieksekusi dan tidak dapat dibatalkan - dengan demikian ini mencegah perubahan DML sebelumnya dibatalkan juga.
Pernyataan yang tercantum di bagian ini (dan sinonim apa pun untuknya) secara implisit mengakhiri transaksi apa pun yang aktif di sesi saat ini, seolah-olah Anda telah melakukan COMMIT sebelum mengeksekusi pernyataan . Pada MySQL 5.5.3, sebagian besar pernyataan ini juga menyebabkan komit implisit setelah dijalankan; untuk detail tambahan, lihat akhir bagian ini.
Sejak ALTER TABLE
adalah salah satu pernyataan yang terpengaruh, kumpulan SQL secara efektif diperlakukan sebagai:
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;
Solusi yang disarankan adalah memisahkan DDL dan DML . Dokumentasi mengatakan:
Anda harus merancang transaksi [DML] Anda untuk tidak menyertakan pernyataan [DDL] tersebut. Jika Anda mengeluarkan pernyataan di awal transaksi yang tidak dapat dibatalkan, dan kemudian pernyataan lain kemudian gagal, efek penuh dari transaksi tidak dapat dibatalkan dalam kasus tersebut dengan mengeluarkan pernyataan ROLLBACK.