Có và Không :-)
Trong cả hai trường hợp, access is serialised (giả sử bạn đang sử dụng một động cơ giao dịch như InnoDB) kể từ khi họ nhấn cùng hàng, vì vậy họ sẽ không can thiệp với nhau. Nói cách khác, các câu lệnh là nguyên tử.
Tuy nhiên, số lượng hàng bị ảnh hưởng thực sự phụ thuộc vào bộ cấu hình của bạn khi bạn mở kết nối. Các page for mysql_affected_rows() đã này để nói (đậm của tôi):
Đối với câu lệnh UPDATE, bị ảnh hưởng-hàng giá trị mặc định là số lượng hàng thực sự thay đổi. Nếu bạn chỉ định cờ CLIENT_FOUND_ROWS cho mysql_real_connect() khi kết nối với mysqld, giá trị hàng bị ảnh hưởng là số hàng "tìm thấy"; có nghĩa là, khớp với mệnh đề WHERE.
Và từ the mysql_real_connect page:
CLIENT_FOUND_ROWS: Trả lại số tìm thấy hàng (phù hợp), không phải là số thay đổi hàng.
Vì vậy, về những gì xảy ra vớiCLIENT_FOUND_ROWS
được cấu hình, hàng bị ảnh hưởng cho:
UPDATE T1 SET C1 = 'dirty' WHERE id = 1
có gì để làm với việc dữ liệu được thay đổi, chỉ những gì hàng phù hợp. Đây sẽ là 1 cho cả hai truy vấn.
Mặt khác, nếu CLIENT_FOUND_ROWS
là không đặt, truy vấn thứ hai sẽ không thực sự thay đổi hàng (vì nó đã được điền bằng 'bẩn') và sẽ có số hàng bằng 0.
Nếu bạn muốn hành vi cùng bất kể thiết lập đó (chỉ thay đổi hiển thị), bạn có thể sử dụng một cái gì đó như:
UPDATE T1 SET C1 = 'dirty' WHERE id = 1 AND C1 <> 'dirty'
Nếu bạn cần nguyên tử, nhưng không muốn sử dụng các bảng InnoDB, [xem bảng khóa MySQL] (http://dev.mysql.com/doc/refman/5.1/en/lock-tables.html) – bobobobo