2012-04-11 6 views
5

Verwendet NOW() in 2 + Abfragen in einer einzigen InnoDB-Transaktion Garantie, dass der eingefügte Datetime-Wert in der Datenbank genau sein wird?NOW() für DATETIME InnoDB Transaktion garantiert?

Mit anderen Worten, ist die NOW(), auch wenn Sie mehr als 20 Abfragen in einer einzigen Transaktion verwenden immer dasselbe, oder wird es ändern?

Antwort

5

Apparently it is not guaranteed über eine Transaktion hinweg, kann aber von Anweisung zu Anweisung wechseln. Es gibt eine Abhilfe Sie as shown here verwenden können:

BEGIN; 
SELECT @now := NOW(); 
INSERT ... VALUES (..., @now, ...); 
INSERT ... VALUES (..., @now, ...); 
UPDATE ... @now ...; 
COMMIT; 

Wenn Sie vermeiden möchten, dass insgesamt setzen nur das aktuelle Datum und die Uhrzeit in eine PHP-Variable und nutzen Sie diese stattdessen.

+0

Hmm .. Ich habe diese Frage mit der PHP-Variable Route eröffnet, haben Sie eine Idee, wie Sie es erreichen? http://stackoverflow.com/questions/10129180/get-datetime-in-php-and-post-it-to-mysql-for-transaction-consistency – Maverick

+0

Ich war unter dem falschen Eindruck, dass 'NOW()' wurde behoben zu Beginn einer Transaktion auf einen bestimmten Wert, aber ich sehe, das ist nicht wahr. Bei Verwendung der MySQL-Replikation wird der von 'NOW()' zurückgegebene Wert vom Replikations-Thread festgelegt, aber der Wert kann zwischen Anweisungen innerhalb einer einzelnen Transaktion geändert werden. Ich glaube, ich war verwirrt wegen des 'NOW()' Verhaltens wegen der Replikations-Semantik, die die einzige Stelle ist, die ich finden kann, wo es irgendeine echte Quelle der Verwirrung in der MySQL-Dokumentation gibt. –

Verwandte Themen