Sollte ich nach einer einzelnen Auswahl bestätigen

8

Ich arbeite mit MySQL 5.0 von Python mit dem MySQLdb-Modul.

Betrachten Sie eine einfache Funktion zum Laden und Zurückgeben des Inhalts einer gesamten Datenbanktabelle:

%Vor%

Diese Abfrage soll eine einfache Datenladung sein und über die einzige SELECT -Anweisung hinaus kein Transaktionsverhalten haben.

Nachdem diese Abfrage ausgeführt wurde, kann es einige Zeit dauern, bis die gleiche Verbindung erneut zum Ausführen anderer Aufgaben verwendet wird, obwohl zwischenzeitlich noch andere Verbindungen in der Datenbank ausgeführt werden können.

Soll ich kurz nach dem Aufruf von connection.commit() cursor.execute(...) aufrufen, um sicherzustellen, dass der Vorgang keine unvollendete Transaktion für die Verbindung hinterlassen hat?

    
Paddy O'Loughlin 08.11.2012, 11:02
quelle

1 Antwort

8

Es gibt zwei Dinge, die Sie beachten müssen:

  1. die Isolationsstufe in Kraft
  2. Welche Art von Status möchten Sie in Ihrer Transaktion sehen?

Die Standardisolationsstufe in MySQL ist REPEATABLE READ , was bedeutet, dass wenn Sie eine SELECT zweimal innerhalb einer Transaktion ausführen, Sie genau dieselben Daten sehen, selbst wenn andere Transaktionen Änderungen festgeschrieben haben.

In den meisten Fällen erwarten die Benutzer festgestellte Änderungen, wenn sie die zweite SELECT-Anweisung ausführen. Dies ist das Verhalten der Isolationsstufe READ COMMITTED .

Wenn Sie die Standardstufe in MySQL nicht geändert haben und Sie tun erwarten, Änderungen in der Datenbank zu sehen, wenn Sie in derselben Transaktion zweimal SELECT ausführen, können Sie dies nicht tun "selbe" Transaktion und Sie müssen Ihre erste SELECT Anweisung festlegen.

Wenn Sie möchten, dass ein konsistenter Zustand der Daten in Ihrer Transaktion angezeigt wird, sollten Sie nicht scheinbar übernehmen.

  

Nach einigen Minuten führt der erste Prozess eine Operation aus, die transaktional ist und versucht, zu committen. Würde dieses Commit fehlschlagen?

Das hängt ganz von Ihrer Definition von ist transaktional ab. Alles, was Sie in einer relationalen Datenbank tun, ist "transaktional" (das ist für MySQL eigentlich nicht ganz richtig, aber Sie können dies aus Gründen der Argumentation annehmen, wenn Sie InnoDB nur als Speichermodul verwenden).

Wenn dieser "erste Prozess" nur Daten auswählt (d. h. eine "schreibgeschützte Transaktion"), dann wird das Commit natürlich funktionieren. Wenn versucht wird, Daten zu ändern, die eine andere Transaktion bereits festgeschrieben hat und Sie mit REPEATABLE READ ausführen, erhalten Sie wahrscheinlich einen Fehler (nachdem Sie gewartet haben, bis alle Sperren freigegeben wurden). Ich bin nicht 100% über das Verhalten von MySQL in diesem Fall.

Sie sollten dies wirklich manuell mit zwei verschiedenen Sitzungen mit Ihrem bevorzugten SQL-Client versuchen, um das Verhalten zu verstehen. Ändern Sie auch Ihre Isolationsstufe, um die Auswirkungen der verschiedenen Ebenen zu sehen.

    
a_horse_with_no_name 08.11.2012, 11:33
quelle

Tags und Links