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

Bagaimana mysqli::commit &mysqli::rollback bekerja?

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).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Halaman Login Visual Basic menyebabkan kesalahan (Kesalahan BC30506 Menangani klausa memerlukan WithEvents....)

  2. Inisialisasi MariaDB 10.4.12 pada CentOS 7.7

  3. Kesalahan:Tablespace untuk tabel xxx ada. Harap BUANG tablespace sebelum IMPORT

  4. Mengunci database MySQL sehingga hanya satu orang sekaligus yang dapat menjalankan kueri?

  5. Fungsionalitas situs web terganggu atau diretas