Di InnoDB, Anda tidak perlu secara eksplisit memulai atau mengakhiri transaksi untuk satu kueri jika Anda belum mengubah pengaturan default autocommit, yaitu "on". Jika komit otomatis aktif, InnoDB secara otomatis menyertakan setiap kueri SQL dalam suatu transaksi, yang setara dengan START TRANSACTION; query; COMMIT;
.
Jika Anda secara eksplisit menggunakan START TRANSACTION
di InnoDB dengan autocommit aktif, lalu setiap kueri dijalankan setelah START TRANSACTION
pernyataan akan baik semua dieksekusi, atau semuanya akan gagal. Ini berguna di lingkungan perbankan, misalnya:jika saya mentransfer $500 ke rekening bank Anda, operasi itu hanya akan berhasil jika jumlahnya telah dikurangi dari saldo bank saya dan ditambahkan ke rekening Anda. Jadi dalam hal ini, Anda akan menjalankan sesuatu seperti
START TRANSACTION;
UPDATE customers SET balance = balance - 500 WHERE customer = 'Daan';
UPDATE customers SET balance = balance + 500 WHERE customer = 'Dennis';
COMMIT;
Ini memastikan bahwa kedua kueri akan berhasil dijalankan, atau tidak sama sekali, tetapi bukan hanya satu. Postingan ini memiliki lebih banyak tentang kapan Anda harus menggunakan transaksi.
Di InnoDB, Anda sangat jarang harus mengunci seluruh tabel; InnoDB, tidak seperti MyISAM, mendukung penguncian tingkat baris. Ini berarti klien tidak harus mengunci seluruh tabel, memaksa klien lain untuk menunggu. Klien hanya boleh mengunci baris yang benar-benar mereka butuhkan, memungkinkan klien lain untuk terus mengakses baris yang mereka butuhkan.
Anda dapat membaca lebih lanjut tentang transaksi InnoDB di sini . Pertanyaan Anda tentang kebuntuan dijawab di bagian 14.2.8.8 dan 14.2.8.9 dari dokumen. Jika kueri gagal, driver MySQL Anda akan menampilkan pesan kesalahan yang menunjukkan alasannya; aplikasi Anda kemudian harus menerbitkan ulang kueri jika diperlukan.
Terakhir, dalam kode contoh Anda, Anda menggunakan mysql_query
. Jika Anda sedang menulis kode baru, harap berhenti menggunakan mysql_
yang lama, lambat, dan tidak digunakan lagi perpustakaan untuk PHP dan gunakan mysqli_
atau PDO sebagai gantinya :)