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

Pegangan basis data DBI dengan AutoCommit disetel ke 0 tidak mengembalikan data yang benar dengan SELECT?

Saya kira Anda menggunakan tabel InnoDB dan bukan tabel MyISAM. Seperti yang dijelaskan dalam model transaksi InnoDB , semua pertanyaan Anda (termasuk SELECT) berlangsung di dalam transaksi.

Ketika AutoCommit aktif, transaksi dimulai untuk setiap kueri dan jika berhasil, transaksi dilakukan secara implisit (jika gagal, perilaku mungkin berbeda, tetapi transaksi dijamin berakhir). Anda dapat melihat komit implisit di binlog MySQL. Dengan menyetel AutoCommit ke false, Anda diharuskan untuk mengelola transaksi sendiri.

Tingkat isolasi transaksi default adalah BACA BERULANG , yang berarti bahwa semua SELECT kueri akan membaca snapshot yang sama (snapshot yang dibuat saat transaksi dimulai).

Selain solusi yang diberikan dalam jawaban lain (ROLLBACK sebelum mulai membaca) berikut adalah beberapa solusi:

Anda dapat memilih tingkat isolasi transaksi lain, seperti BACA BERKOMITMEN , yang membuat SELECT . Anda kueri membaca snapshot baru setiap saat.

Anda juga dapat meninggalkan AutoCommit ke true (pengaturan default) dan mulai transaksi Anda sendiri dengan mengeluarkan BEGIN WORK . Ini akan menonaktifkan sementara AutoCommit perilaku sampai Anda mengeluarkan COMMIT atau ROLLBACK pernyataan setelah itu setiap kueri mendapatkan transaksinya sendiri lagi (atau Anda memulai yang lain dengan BEGIN WORK ).

Saya, secara pribadi, akan memilih metode yang terakhir, karena tampaknya lebih elegan.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kelas koneksi database PHP

  2. Menemukan jeda baris dan carriage return (\r\n) di MySQL

  3. Doctrine 2 SUM() pembantu yang setara?

  4. Pencarian MYSQL melalui sel dengan nilai yang dipisahkan koma

  5. Pola nama tabel tidak boleh NULL atau kosong di java