Unsere Anwendung löst eine INSERT-Abfrage in der MySQL-Datenbank aus, um Datensätze hinzuzufügen. Ich möchte wissen, ob die Datensätze automatisch festgeschrieben werden. Wann führt die Datenbank ein Rollback durch, wenn ich den Befehl ROLLBACK ausführe? Ist ein ROLLBACK nach einem COMMIT möglich?
13
Antworten:
Die Antwort auf Ihre Frage hängt davon ab, ob Sie sich in einer Transaktion befinden, die mehr als eine Anweisung umfasst. (Sie haben die Frage mit InnoDB markiert, die Antwort wäre mit MyISAM anders.)
Aus dem Referenzhandbuch: http://dev.mysql.com/doc/refman/5.1/en/commit.html
Wenn Sie also nur
INSERT
Datensätze verwenden, werden diese standardmäßig festgeschrieben, und es macht keinen Sinn, sie zurückzusetzen. (Dies ist praktisch dasselbe wie das Umschließen jeder Anweisung zwischenBEGIN
undCOMMIT
.)Wenn Sie sich jedoch explizit mit Transaktionen befassen, müssen Sie das
COMMIT
Commit zum Speichern der Datensätze verwenden, können es jedoch auch verwendenROLLBACK
.Sie können eine Transaktion explizit mit
START TRANSACTION
(oderBEGIN
) starten . Dies ist unabhängig von derautocommit
Einstellung (standardmäßig aktiviert):Wenn
autocommit=0
ich der Meinung bin, dass eine Anweisung nach einem anderen Transaktionsende eine Transaktion startet, können Sie diese auchSTART TRANSACTION
explizit verwenden. so interpretiere ich das jedenfalls :Genauer gesagt scheint "ein anderer Weg, eine Transaktion zu beginnen" zu implizieren, dass das Setzen von "autocommit = 0" ausreicht, um eine Transaktion zu starten (zumindest kurz vor jeder Anweisung beim Start einer Sitzung oder nach einem
COMMIT
/ROLLBACK
). Ich würde vorschlagen,BEGIN
oderSTART TRANSACTION
explizit zu verwenden, auch wennautocommit=0
, da es klarer machen kann, wann die Transaktion beginnt oder endet.(Wie Sie eine Transaktion starten, hängt möglicherweise davon ab, wie Ihre Anwendung MySQL verwendet.)
quelle
Standardmäßig ist InnoDB auf autocommit = 1 oder ON eingestellt . Einmal festgeschrieben, können sie nicht zurückgesetzt werden .
Sie müssten eines von zwei Dingen tun, um es zukünftig zu deaktivieren:
OPTION 1: Fügen Sie dies zu /etc/my.cnf hinzu und starten Sie mysql neu
OPTION 2: Führen Sie eine dieser Aktionen in der Open DB Conenction aus, bevor Sie mit einer aussagekräftigen SQL-Operation beginnen
Unter diesen beiden Optionen müssten Sie ein manuelles COMMIT oder ein manuelles ROLLBACK durchführen .
VORBEHALT
Wenn die Tabelle MyISAM ist, ist die Erklärung einfacher. Da für die MyISAM-Speicher-Engine keine Transaktionen vorhanden sind, sind alle ausgeführten INSERT-, UPDATE- und DELETE-Operationen permanent. Keine Rollbacks.
quelle