Frage

Ich versuche, das Konzept der ‚autocommit‘ besser zu verstehen, wenn sie mit einer Postgres (psycopg) Verbindung zu arbeiten. Lassen Sie uns sagen, dass ich eine neue Verbindung haben, legen Sie die Isolationsstufe auf ISOLATION_LEVEL_AUTOCOMMIT, dann direkt mit diesen SQL ausführen, ohne den Cursor beginnen / Rollback-Verfahren (als Übung, nicht sagen, dass ich das wirklich tun wollen):

INSERT A
INSERT B
BEGIN
    INSERT C
    INSERT D
ROLLBACK

Was passiert mit INSERTs C & D?

Ist autocommit ist lediglich eine interne Einstellung in psycopg, die beeinflusst, wie es ausgibt beginnt? In diesem Fall ist die obige SQL unafected; INSERTs A & B sind so schnell begangen, wie sie fertig ist, während C & D in einer Transaktion und Rollback ausgeführt werden. Welche Isolationsstufe ist, dass Transaktion Lauf unter?

Oder ist eine wirkliche Einstellung der Verbindung selbst Autocommit? In diesem Fall, wie wirkt er sich den Umgang mit BEGIN? Ist es ignoriert, oder ist es die autocommit Einstellung außer Kraft setzen, um tatsächlich eine Transaktion zu starten? Welche Isolationsstufe ist, dass Transaktion Lauf unter?

Oder bin ich völlig off-target?

War es hilfreich?

Lösung

Autocommit-Modus bedeutet, dass jede Anweisung implizit beginnt und endet die Transaktion aus.

In Ihrem Fall, wenn autocommit ist aus:

  • Der Kunde wird implizit die Transaktion für die erste Anweisung starten
  • Die BEGIN wird eine Warnung sagen, dass die Transaktion bereits gestartet
  • Die ROLLBACK wird alle vier Aussagen Rollback

Wenn autocommit eingeschaltet ist, wird nur die c und d werden zurückgesetzt.

Beachten Sie, dass PostgreSQL hat kein internes AUTOCOMMIT Verhalten seit 8.0. Alle autocommit Funktionen auf den Kunden verlassen werden

Andere Tipps

In der Standardeinstellung hat PostgreSQL Autocommit auf, was bedeutet, dass jede Anweisung als eine Transaktion behandelt wird. Wenn Sie ihm ausdrücklich sagen, um eine Transaktion zu starten, wie in Ihrem Beispiel sind diese Elemente in einer neuen Transaktion.

In Ihrem Beispiel A und B würden begangen werden, C und D werden würden zurückgerollt.

Wenn autocommit auf psycopg ist sendet nur alles auf den PostgreSQL-Server, ohne zu versuchen, die Transaktion für Sie zu verwalten. Wenn Sie nicht verwenden Sie BEGIN / COMMIT / ROLLBACK dann wird jeder .execute () Anruf sofort ausgeführt und engagiert. Sie können durch die Ausgabe von BEGIN / COMMIT / ROLLBACK-Befehlen Ihr eigenes Transaktionsmanagement tun. Offensichtlich im Autocommit-Modus kann man nicht nennen conn.commit () oder conn.rollback (), weil psycopg nicht den Überblick über die Transaktionen zu halten, aber nur etwas Senden Sie .Execute () direkt an das Backend.

In Ihrem Beispiel A und B würden begangen werden, C und D werden würden zurückgerollt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top