Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Sind einzelne MySQL-Anweisungen in MyISAM und InnoDB atomar?

Ja und Nein :-)

In beiden Fällen ist der Zugriff serialisiert (vorausgesetzt, Sie verwenden eine Transaktions-Engine wie InnoDB), da sie dieselbe Zeile treffen, sodass sie sich nicht gegenseitig stören. Mit anderen Worten, die Anweisungen sind atomar.

Die Anzahl der betroffenen Zeilen hängt jedoch tatsächlich von Ihrem Konfigurationssatz ab, wenn Sie die Verbindung öffnen. Die Seite für mysql_affected_rows() hat Folgendes zu sagen (mein Fettdruck):

Und von der mysql_real_connect-Seite :

Also, was mit passiert CLIENT_FOUND_ROWS konfiguriert werden, die betroffenen Zeilen für:

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

habe nichts damit zu tun, ob die Daten geändert werden nur welche Zeilen übereinstimmen. Dies wäre 1 für beide Abfragen.

Wenn andererseits CLIENT_FOUND_ROWS war nicht gesetzt, würde die zweite Abfrage die Zeile nicht wirklich ändern (da sie bereits mit 'dirty' gefüllt ist) und eine Zeilenanzahl von null haben.

Wenn Sie das dasselbe wollten Verhalten unabhängig von dieser Einstellung (nur Änderungen anzeigen), könnten Sie so etwas verwenden wie:

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