Ada dua pelajaran yang bisa dipetik di sini:
- Data cadangan
- Lakukan pernyataan UPDATE/DELETE dalam transaksi, sehingga Anda dapat menggunakan
ROLLBACK
jika segala sesuatunya tidak berjalan sesuai rencana
Menyadari penanganan transaksi (komit otomatis, eksplisit dan implisit) untuk database Anda dapat menyelamatkan Anda dari keharusan memulihkan data dari cadangan.
Transaksi mengontrol pernyataan manipulasi data untuk memastikannya bersifat atomik. Menjadi "atom" berarti transaksi terjadi, atau tidak. Satu-satunya cara untuk memberi sinyal penyelesaian transaksi ke database adalah dengan menggunakan COMMIT
atau ROLLBACK
pernyataan (per ANSI-92, yang sayangnya tidak menyertakan sintaks untuk membuat/memulai transaksi sehingga khusus vendor). COMMIT
menerapkan perubahan (jika ada) yang dibuat dalam transaksi. ROLLBACK
mengabaikan tindakan apa pun yang terjadi dalam transaksi - sangat diinginkan ketika pernyataan UPDATE/DELETE melakukan sesuatu yang tidak diinginkan .
Biasanya pernyataan DML (Sisipkan, Perbarui, Hapus) individu dilakukan dalam transaksi komit otomatis - pernyataan tersebut dilakukan segera setelah pernyataan berhasil diselesaikan. Yang berarti tidak ada kesempatan untuk mengembalikan database ke status sebelum pernyataan dijalankan dalam kasus seperti milik Anda. Ketika terjadi kesalahan, satu-satunya opsi pemulihan yang tersedia adalah merekonstruksi data dari cadangan (asalkan ada). Di MySQL, komit otomatis adalah pada secara default untuk InnoDB - MyISAM tidak mendukung transaksi. Itu dapat dinonaktifkan dengan menggunakan:
SET autocommit = 0
Transaksi eksplisit adalah ketika pernyataan dibungkus dalam blok kode transaksi yang ditentukan secara eksplisit - untuk MySQL, itu START TRANSACTION
. Ini juga membutuhkan COMMIT
yang dibuat secara eksplisit atau ROLLBACK
pernyataan di akhir transaksi. Transaksi bertingkat berada di luar cakupan topik ini.
Transaksi implisit sedikit berbeda dari transaksi eksplisit. Transaksi implisit tidak memerlukan pendefinisian transaksi secara eksplisit. Namun, seperti transaksi eksplisit, mereka memerlukan COMMIT
atau ROLLBACK
pernyataan yang akan diberikan.
Kesimpulan
Transaksi eksplisit adalah solusi paling ideal - mereka memerlukan pernyataan, COMMIT
atau ROLLBACK
, untuk menyelesaikan transaksi, dan apa yang terjadi dinyatakan dengan jelas untuk dibaca orang lain jika diperlukan. Transaksi implisit diperbolehkan jika bekerja dengan database secara interaktif, tetapi COMMIT
pernyataan seharusnya hanya ditentukan setelah hasil telah diuji &benar-benar ditentukan untuk menjadi valid.
Itu berarti Anda harus menggunakan:
SET autocommit = 0;
START TRANSACTION;
UPDATE ...;
...dan hanya gunakan COMMIT;
ketika hasilnya benar.
Yang mengatakan, pernyataan UPDATE dan DELETE biasanya hanya mengembalikan jumlah baris yang terpengaruh, bukan detail spesifik. Ubah pernyataan tersebut menjadi pernyataan SELECT &tinjau hasilnya untuk memastikan kebenaran sebelumnya untuk mencoba pernyataan UPDATE/DELETE.
tambahan
Pernyataan DDL (Bahasa Definisi Data) secara otomatis berkomitmen - mereka tidak memerlukan pernyataan COMMIT. IE:Tabel, indeks, prosedur tersimpan, database, dan pernyataan pembuatan atau perubahan tampilan.