worden meinen Kopf für eine Weile auf dem Kratzen ....PDO :: ATTR_AUTOCOMMIT ignoriert nicht transaktions INSERT/UPDATE
ich ein PDO-Objekt mit pdo->setAttribute(PDO::ATTR_AUTOCOMMIT,0);
habe, wie ich FOR UPDATE
mit einigen InnoDB-Tabellen verwenden mag. Das Lesen der MySQL-Dokumentation wird FOR UPDATE
nur sperren gelesenen Zeilen, wenn:
- Sie in einer Transaktion sind
- Sie sind nicht in einer Transaktion und
set autocommit=0
hat
So erteilt worden, ich bin Verwenden Sie ATTR_AUTOCOMMIT
, damit das PDO-Objekt Zeilen sperren kann. In beiden Fällen führt dies dazu, dass INSERT- und UPDATE-Anweisungen nicht angewendet werden. Diese Anweisungen haben nichts mit FOR UPDATE
zu tun, sie laufen nur durch das gleiche PDO-Objekt mit vorbereiteten Anweisungen.
Meine MySQL-Query-Log wie folgt aussieht:
xxx Connect [email protected]
xxx Query set autocommit=0
xxx Query INSERT INTO foo_tbl (bar, baz) VALUES ('hello','world')
xxx Quit
PHP/PDO nicht beschweren, aber aus der Tabelle auswählen zeigt, dass die Daten geschrieben worden ist.
Die Abfragen, die ich ausgeführt habe, wurden Tausende von Zeit zuvor ausgeführt; nur die ATTR_AUTOCOMMIT
Änderung wurde vorgenommen. Wenn Sie diese Option entfernen, funktioniert alles wieder. Transaktionen funktionieren auch mit der Option autocommit=0
.
Gibt es weitere Aufrufe, die auf dem PDO-Objekt (commit()
beklagt zu Recht, dass es nicht in einer Transaktion ist) machen müssen, um die Änderungen zu machen? Grundsätzlich möchte ich ein einfaches PDO-Objekt, aber mit der Option, Zeilen außerhalb von Transaktionen für InnoDB-Tabellen zu sperren (der Hintergrund dafür ist zu lang und langweilig für hier).
Ich bin sicher, dass dies etwas dumm ist mir fehlt Kratzer Kopf
Keine Sorge, wir alle vermissen manchmal Dinge! Ich weiß, es passiert mir viel mehr als ich zugeben möchte :-) – Josh