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'