Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Pemulihan setelah permintaan pembaruan MySQL yang salah?

Ada dua pelajaran yang bisa dipetik di sini:

  1. Data cadangan
  2. 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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Apa susunan MySQL yang terbaik untuk menerima semua karakter unicode?

  2. Apakah Mysql memiliki setara dengan @@ROWCOUNT seperti di mssql?

  3. MySQL - Apakah mungkin menggunakan LIKE pada semua kolom dalam sebuah tabel?

  4. Perintah tidak sinkron; Anda tidak dapat menjalankan perintah ini sekarang SQL

  5. MySQL NET Connect 6.7.2 di Visual Studio 2012