Tidak, transaksi tidak akan melacak jika satu Pernyataan SQL gagal.
Jika satu Pernyataan SQL gagal, pernyataan dibatalkan (seperti yang dijelaskan dalam Jawaban @eggyal) - tetapi transaksi masih terbuka. Jika Anda memanggil commit
sekarang, tidak ada pengembalian dari pernyataan yang berhasil dan Anda baru saja memasukkan data "rusak" ke dalam database Anda. Anda dapat mereproduksi ini dengan mudah:
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)
Anda melihat bahwa penyisipan 'foo' dan 'bar' berhasil meskipun pernyataan SQL kedua gagal - Anda bahkan dapat melihat bahwa AUTO_INCREMENT
-nilai telah ditingkatkan oleh kueri yang salah.
Jadi Anda harus memeriksa hasil setiap query
-panggil dan jika gagal, panggil rollback
untuk membatalkan kueri yang berhasil. Jadi kode Lorenzo dalam manual PHP masuk akal.
Satu-satunya kesalahan yang memaksa MySQL untuk mengembalikan transaksi adalah "kebuntuan transaksi" (dan ini khusus untuk InnoDB, mesin penyimpanan lain mungkin menangani kesalahan itu secara berbeda).