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

Apakah pernyataan mysql tunggal atom di MyISAM dan InnoDB?

Ya dan Tidak :-)

Dalam kedua kasus, akses diserialisasi (dengan asumsi Anda menggunakan mesin transaksional seperti InnoDB) karena mereka mencapai baris yang sama, sehingga mereka tidak akan saling mengganggu. Dengan kata lain, pernyataan adalah atom.

Namun, jumlah baris yang terpengaruh sebenarnya bergantung pada set konfigurasi Anda saat Anda membuka koneksi. laman untuk mysql_affected_rows() mengatakan ini (tebal saya):

Dan dari laman mysql_real_connect :

Jadi, dalam hal apa yang terjadi dengan CLIENT_FOUND_ROWS sedang dikonfigurasi, baris yang terpengaruh untuk:

UPDATE T1 SET C1 = 'dirty' WHERE id = 1

memiliki tidak ada berkaitan dengan apakah data diubah, hanya baris yang cocok. Ini akan menjadi 1 untuk kedua kueri.

Sebaliknya, jika CLIENT_FOUND_ROWS adalah tidak ditetapkan, kueri kedua tidak akan benar-benar mengubah baris (karena sudah diisi dengan 'kotor') dan akan memiliki jumlah baris nol.

Jika Anda menginginkan yang sama perilaku terlepas dari pengaturan itu (hanya menampilkan perubahan), Anda dapat menggunakan sesuatu seperti:

UPDATE T1 SET C1 = 'dirty' WHERE id = 1 AND C1 <> 'dirty'


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Definisi PRIMARY KEY dalam pernyataan MySQL CREATE TABLE

  2. mysql tinyint(1) vs tinyint(2) vs tinyint(3) vs tinyint(4)

  3. Memulihkan Database MySQL saat menginstal ulang Wamp

  4. MySQL GROUP OLEH dan COUNT

  5. Menggunakan CONCAT dengan Pemicu MySQL (Kesalahan pada ,)