6 Stimmen

Kann ich Savepoints beim Starten neuer Transaktionen in Oracle ersetzen?

Im Moment sieht der Prozess, den wir für das Einfügen von Datensätzen verwenden, ungefähr so aus:

(und beachten Sie, dass "Satz von Datensätzen" so etwas wie ein Personendatensatz zusammen mit ihren Adressen, Telefonnummern oder anderen verbundenen Tabellen bedeutet).

  1. Starten Sie eine Transaktion.
  2. Fügen Sie eine Reihe von Datensätzen ein, die miteinander in Beziehung stehen.
  3. Commit, wenn alles erfolgreich war, sonst Rollback.
  4. Gehen Sie zurück zu Schritt 1 für den nächsten Satz von Datensätzen.

Sollten wir mehr in dieser Richtung tun?

  1. Starten Sie eine Transaktion am Anfang des Skripts
  2. Starten Sie einen Speicherpunkt für jeden Satz von Datensätzen.
  3. Einfügen einer Reihe von Bezugsdatensätzen.
  4. Gehen Sie bei einem Fehler zum Speicherpunkt zurück, fahren Sie fort, wenn alles erfolgreich war.
  5. Schließen Sie die Transaktion am Anfang des Skripts ab.

Nachdem ich einige Probleme mit ORA-01555 hatte und einige Ask Tom-Artikel gelesen habe (wie diese ), denke ich darüber nach, das zweite Verfahren auszuprobieren. Wie Tom schon sagte, sollte der Beginn einer neuen Transaktion natürlich von den geschäftlichen Erfordernissen abhängig gemacht werden. Ist der zweite Prozess einen Versuch wert, oder ist er eine schlechte Idee?

5voto

APC Punkte 140727

Eine Transaktion sollte eine sinnvolle Arbeitseinheit sein. Was aber eine Arbeitseinheit ist, hängt vom Kontext ab. In einem OLTP-System wäre eine Arbeitseinheit eine einzelne Person, zusammen mit ihren Adressdaten, usw. Es klingt aber so, als ob Sie eine Art Stapelverarbeitung implementieren, bei der viele Personen geladen werden.

Wenn Sie Probleme mit ORA-1555 haben, liegt das höchstwahrscheinlich daran, dass Sie eine lang laufende Abfrage haben, die Daten liefert, die durch andere Transaktionen aktualisiert werden. Das Commit innerhalb Ihrer Schleife trägt zur zyklischen Verwendung von UNDO-Segmenten bei und erhöht somit die Wahrscheinlichkeit, dass die Segmente, auf die Sie sich zur Gewährleistung der Lesekonsistenz verlassen, wiederverwendet wurden. Es ist also wahrscheinlich eine gute Idee, dies nicht zu tun.

Ob die Verwendung von SAVEPOINTs die Lösung ist, steht auf einem anderen Blatt. Ich bin mir nicht sicher, welchen Vorteil Ihnen das in Ihrer Situation bringen würde. Da Sie mit Oracle10g arbeiten, sollten Sie vielleicht die Verwendung von Bulk DML-Fehlerprotokollierung stattdessen.

Alternativ können Sie die Abfrage auch so umschreiben, dass sie mit kleineren Datenpaketen arbeitet. Ohne mehr über die Besonderheiten Ihres Prozesses zu wissen, kann ich keine spezifischen Ratschläge geben. Aber im Allgemeinen ist es vielleicht besser, einen Cursor für 10000 Datensätze zu öffnen, als ihn zwanzigmal für jeweils 500 Zeilen zu öffnen. Außerdem ist zu überlegen, ob der Einfügevorgang effizienter gestaltet werden kann, z. B. durch Verwendung von Bulk Collection und FORALL.

1voto

DCookie Punkte 41310

Einige Gedanken...

  1. Mir scheint, einer der Punkte des asktom-Links war es, Ihre Rollback/undo angemessen zu dimensionieren, um die 1555er zu vermeiden. Gibt es einen Grund, warum dies nicht möglich ist? Wie er betont, ist es viel billiger, Festplatten zu kaufen, als Code zu schreiben und zu pflegen, um die Rollback-Beschränkungen zu umgehen (obwohl ich zweimal hinschauen musste, als ich den Preis von 250 Dollar für eine 36-GB-Festplatte las - dieser Thread begann 2002! Eine gute Illustration des Mooreschen Gesetzes).
  2. Dieser Link (Burleson) zeigt ein mögliches Problem mit Speicherpunkten.
  3. Handelt es sich bei Ihrer Transaktion in Wirklichkeit um die Schritte 2, 3 und 5 in Ihrem zweiten Szenario? Wenn ja, würde ich das tun - jede Transaktion festschreiben. Klingt für mich ein bisschen wie Szenario 1 ist eine Sammlung von Transaktionen in eine gerollt?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X