it-swarm.asia

Apakah INSERT mendapatkan komitmen otomatis?

Aplikasi kami meluncurkan kueri INSERT ke Database MySQL untuk menambahkan catatan. Saya ingin tahu apakah rekaman mendapatkan komitmen otomatis atau tidak. Jika saya menjalankan perintah ROLLBACK, kapan database melakukan rollback? Apakah ROLLBACK dapat dilakukan setelah KOMIT?

13
RPK

Jawaban untuk pertanyaan Anda tergantung pada apakah Anda dalam suatu transaksi yang akan mencakup lebih dari satu pernyataan. (Anda telah menandai pertanyaan dengan InnoDB, jawabannya akan berbeda dengan MyISAM.)

Dari manual referensi: http://dev.mysql.com/doc/refman/5.1/en/commit.html

Secara default, MySQL berjalan dengan mode autocommit diaktifkan. Ini berarti bahwa segera setelah Anda menjalankan pernyataan yang memperbarui (memodifikasi) sebuah tabel, MySQL menyimpan pembaruan pada disk untuk membuatnya permanen.

Jadi ya, secara default, jika Anda hanya menggunakan INSERT, catatan yang Anda masukkan akan dikomit, dan tidak ada gunanya mencoba mengembalikannya. (Ini secara efektif sama dengan membungkus setiap pernyataan antara BEGIN dan COMMIT.)

Namun, jika Anda berurusan dengan transaksi secara eksplisit, Anda harus menggunakan COMMIT untuk menyimpan catatan, tetapi Anda juga dapat menggunakan ROLLBACK.

Anda dapat memulai transaksi secara eksplisit dengan menggunakan START TRANSACTION (atau BEGIN). Ini tidak tergantung pada pengaturan autocommit (diaktifkan secara default):

Dengan START TRANSACTION, autocommit tetap dinonaktifkan hingga Anda mengakhiri transaksi dengan COMMIT atau ROLLBACK. Mode autocommit kemudian kembali ke keadaan sebelumnya.

Atau, jika autocommit=0, Saya pikir pernyataan apa pun yang mengikuti akhir transaksi, akan memulai transaksi (tetapi Anda masih dapat menggunakan START TRANSACTION secara eksplisit); setidaknya itulah cara saya menafsirkan ini :

Mode autocommit. Jika diatur ke 1, semua perubahan pada tabel segera berlaku. Jika diatur ke 0, Anda harus menggunakan COMMIT untuk menerima transaksi atau ROLLBACK untuk membatalkannya. Jika autocommit bernilai 0 dan Anda mengubahnya menjadi 1, MySQL melakukan COMMIT otomatis dari setiap transaksi terbuka. Cara lain untuk memulai transaksi adalah dengan menggunakan START TRANSACTION atau BEGIN statement. Lihat Bagian 12.3.1, “MULAI Sintaksis TRANSAKSI, KOMIT, dan ROLLBACK”.

Lebih khusus "cara lain untuk memulai transaksi" tampaknya menyiratkan bahwa pengaturan "autocommit = 0" sudah cukup untuk memulai transaksi (setidaknya sebelum setiap pernyataan pada awal sesi atau yang mengikuti COMMIT/ROLLBACK). Saya akan menyarankan untuk menggunakan BEGIN atau START TRANSACTION tetap secara eksplisit meskipun autocommit=0, karena dapat memperjelas untuk melihat kapan transaksi dimulai atau berakhir.

(Bagaimana Anda memulai transaksi mungkin tergantung pada cara aplikasi Anda menggunakan MySQL.)

10
Bruno

Secara default, InnoDB diatur ke autocommit = 1 atau ON . Setelah berkomitmen, mereka tidak dapat diputar kembali.

Anda harus melakukan salah satu dari dua hal untuk menonaktifkannya di masa mendatang:

OPSI 1: Tambahkan ini ke /etc/my.cnf dan restart mysql

[mysqld]
autocommit=0

OPSI 2: Lakukan salah satu dari ini di DB Conenction terbuka sebelum memulai SQL yang bermakna

SET autocommit = 0;
START TRANSACTION;

Di bawah dua opsi ini, Anda harus melakukan KOMIT manual atau ROLLBACK manual .

CAVEAT

Jika tabelnya adalah MyISAM, maka penjelasannya lebih sederhana. Karena tidak ada transaksi untuk mesin penyimpanan MyISAM, semua INSERT, UPDATE, dan DELETE yang dijalankan adalah permanen. Tidak ada pengembalian apa pun.

7
RolandoMySQLDBA