it-swarm.com.de

Werden INSERTs automatisch festgeschrieben?

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. Wenn ich den Befehl ROLLBACK ausführe, wann führt die Datenbank einen Rollback durch? Ist ein ROLLBACK nach einem COMMIT möglich?

13
RPK

Die Antwort auf Ihre Frage hängt davon ab, ob Sie sich in einer Transaktion befinden oder nicht, die sich über mehrere Anweisungen erstreckt. (Sie haben die Frage mit InnoDB markiert, die Antwort wäre bei MyISAM anders.)

Aus dem Referenzhandbuch: http://dev.mysql.com/doc/refman/5.1/en/commit.html

Standardmäßig wird MySQL mit aktiviertem Autocommit-Modus ausgeführt. Dies bedeutet, dass MySQL das Update auf der Festplatte speichert, sobald Sie eine Anweisung ausführen, mit der eine Tabelle aktualisiert (geändert) wird, um sie dauerhaft zu machen.

Wenn Sie also nur INSERT verwenden, werden die von Ihnen eingefügten Datensätze standardmäßig festgeschrieben, und es macht keinen Sinn, sie zurückzusetzen. (Dies ist praktisch dasselbe wie das Umschließen jeder Anweisung zwischen BEGIN und COMMIT.)

Wenn Sie jedoch explizit mit Transaktionen arbeiten, müssen Sie COMMIT verwenden, um die Datensätze festzuschreiben, aber Sie können auch ROLLBACK verwenden.

Sie können eine Transaktion explizit mit START TRANSACTION (Oder BEGIN) starten. Dies ist unabhängig von der Einstellung autocommit (standardmäßig aktiviert):

Mit START TRANSACTION bleibt die automatische Festschreibung deaktiviert, bis Sie die Transaktion mit COMMIT oder ROLLBACK beenden. Der Autocommit-Modus kehrt dann zu seinem vorherigen Status zurück.

Wenn alternativ autocommit=0 Eine Anweisung nach einem anderen Transaktionsende startet, wird eine Transaktion gestartet (Sie können START TRANSACTION Dennoch explizit verwenden). das ist zumindest die Art und Weise, wie ich interpretiere das :

Der Autocommit-Modus. Bei der Einstellung 1 werden alle Änderungen an einer Tabelle sofort wirksam. Wenn auf 0 gesetzt, müssen Sie COMMIT verwenden, um eine Transaktion zu akzeptieren, oder ROLLBACK, um sie abzubrechen. Wenn Autocommit 0 ist und Sie es in 1 ändern, führt MySQL ein automatisches COMMIT für jede offene Transaktion durch. Eine andere Möglichkeit, eine Transaktion zu starten, besteht darin, eine START TRANSACTION- oder BEGIN-Anweisung zu verwenden. Siehe Abschnitt 12.3.1, „START TRANSACTION, COMMIT und ROLLBACK-Syntax“.

Insbesondere scheint "eine andere Art, eine Transaktion zu beginnen" zu implizieren, dass die Einstellung "autocommit = 0" ausreicht, um eine Transaktion zu starten (zumindest kurz vor jeder Anweisung zu Beginn einer Sitzung oder nach einem COMMIT/ROLLBACK). Ich würde vorschlagen, BEGIN oder START TRANSACTION Trotzdem explizit zu verwenden, selbst wenn autocommit=0, Da dies 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.)

10
Bruno

Standardmäßig ist InnoDB auf Autocommit = 1 oder ON gesetzt. Einmal festgeschrieben, können sie nicht mehr zurückgesetzt werden.

Sie müssten eines von zwei Dingen tun, um es in Zukunft zu deaktivieren:

OPTION 1: Fügen Sie dies zu /etc/my.cnf hinzu und starten Sie mysql neu

[mysqld]
autocommit=0

OPTION 2: Führen Sie eine dieser Aktionen in der geöffneten DB-Konnektion aus, bevor Sie mit aussagekräftigem SQL beginnen

SET autocommit = 0;
START TRANSACTION;

Unter diesen beiden Optionen müssten Sie ein manuelles COMMIT oder ein manuelles ROLLBACK ausfü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 INSERTs, UPDATEs und DELETEs permanent. Keine Rollbacks.

7
RolandoMySQLDBA