Ich teste gerade einen Batch-Prozess, der viele DML-Anweisungen ausführt, aber nicht sofort ein Commit ausführt. Es wäre schön, wenn Sie die "ausstehenden" Änderungen aus einer anderen Sitzung anzeigen könnten, während die Transaktion nicht festgeschrieben ist. Ist das möglich?
Beispiel:
Insert into table myTable (col1, col2) values ("col1", "col2");
--Somehow view the pending transaction maybe by system view?....
...other DML statements....
commit;
oracle
oracle-10g
transaction
Kontaktmatt
quelle
quelle
Antworten:
Abhängig von den Details Ihres Stapelprozesses und dem Grund, warum Sie versuchen, die nicht festgeschriebenen Änderungen anzuzeigen, gibt es einige unterschiedliche Ansätze.
1) Oracle Workspace Manager ist ein Tool, das ursprünglich entwickelt wurde, um Entwicklern von Spatial-Anwendungen die Ausführung von Transaktionen mit extrem langer Laufzeit zu ermöglichen (dh Transaktionen, für die mehrere Tage oder Wochen erforderlich sind, um herauszufinden, wo eine Pipeline in einer Transaktion ausgeführt werden soll) ). Ihr Stapelverarbeitungsprozess könnte einen neuen Arbeitsbereich erstellen (was logischerweise mit dem Erstellen einer neuen Transaktion vergleichbar ist). Nehmen Sie die gewünschten Änderungen in diesem Arbeitsbereich vor, während Sie einen Commit ausführen, wann immer dies gewünscht wird. In einer separaten Sitzung werden die festgeschriebenen Änderungen erst angezeigt, wenn Sie den Arbeitsbereich des Stapelverarbeitungsprozesses betreten haben. Wenn der Batch-Vorgang abgeschlossen ist, kann der Arbeitsbereich wieder mit dem Live-Arbeitsbereich zusammengeführt werden, was dem Festschreiben einer Transaktion entspricht.
2) Mit dem DBMS_XA-Paket können Sie eine Transaktion von einer Sitzung zu einer anderen "übergeben" und einer Sitzung erlauben, eine Verbindung zu einer Transaktion herzustellen , die von einer anderen Sitzung gestartet wurde. Dies ist ein ziemlich undurchsichtiges Paket, aber es gab kürzlich ein gutes Beispiel für die Verwendung in der PL / SQL-Challenge (Sie benötigen möglicherweise ein kostenloses Konto, um darauf zuzugreifen).
3) Wenn Sie nur versuchen, den Status des Stapelverarbeitungsprozesses und nicht die tatsächlichen Daten anzuzeigen, kann der Stapelverarbeitungsprozess Protokollinformationen mithilfe von autonomen Transaktionen schreiben, die Sie dann in einer anderen Sitzung abfragen können. Oder Sie können das Paket DBMS_APPLICATION_INFO verwenden , um Ihre Anwendung verschiedene Attribute in V $ SESSION und / oder V $ SESSION_LONGOPS aktualisieren zu lassen, damit Sie den Status der Auslastung aus einer anderen Sitzung überwachen können.
quelle
edit: dies wurde geschrieben, bevor die Frage geklärt wurde
Sie können Flashback-Abfragen verwenden, um die Tabelle ohne Ihre eigenen nicht festgeschriebenen Daten anzuzeigen.
Erwägen:
Um den Unterschied zwischen der Tabelle mit meiner Transaktion und der Tabelle aus Sicht anderer zu sehen, könnte ich Folgendes ausgeben:
quelle
Ja - LogMiner kann dies tun. Wenn Sie nur festgeschriebene Transaktionen wünschen, müssen Sie die Ausgabe gezielt filtern ! Und es ist
TABLE_NAME
inV$LOGMINER_CONTENTS
, das ist , wie man an einem einzigen Tisch aussehen würde.quelle
Was Oracle nicht hat, ist ein nicht festgeschriebener Leseisolationsmodus . Mit anderen Worten, Sie können nicht festgeschriebene Daten in einer anderen Transaktion nicht abfragen.
Es gibt Möglichkeiten, Informationen aus einer lang laufenden Transaktion zu erhalten - eine bisher nicht erwähnte Möglichkeit sind autonome Transaktionen (die mit Vorsicht verwendet werden sollten).
quelle
Es gibt keine direkte Methode; Sie müssen entweder die Protokolle analysieren (wie in einer anderen Antwort erwähnt) oder alternative Methoden verwenden, um zu sehen, was in einem langfristigen Prozess geschieht.
Persönlich empfehle ich die Verwendung autonomer Transaktionen, um diese Funktion zu aktivieren - nicht für die Transaktion selbst, sondern als Protokollierungsmechanismus, der Sie über die aktuellen Vorgänge informiert. Beispielsweise könnte PROCEDURE LONG_ACTION den Aufruf PROCEDURE WRITE_LOG_ENTRY (definiert als autonome Transaktion) haben, der einen VARCHAR2 in eine andere Tabelle schreibt. Autonome Transaktionen beeinträchtigen Ihre aktuelle Transaktion NICHT (aus LOGISCHER Sicht; achten Sie auf mögliche Auswirkungen auf die Leistung), sodass Sie anhand Ihrer Protokolleinträge unabhängig von einem COMMIT oder ROLLBACK in Ihrer aktuellen Transaktion sehen können, was vor sich geht. Das heißt, Sie können das mit einer massiven DML-Anweisung tun. Sie müssten eine Schleife verwenden.
Erwägen:
Aus den oben genannten Gründen erhalten Sie unabhängig vom Erfolg der langen Aktion alle 500 verarbeiteten Zeilen einen Protokolleintrag. Wenn Sie ein genaues Duplikat der Daten benötigen, um zu sehen, wie es funktioniert, empfehle ich, eine Duplikattabelle zu erstellen und eine Prozedur aufzurufen, die die Daten dupliziert (wobei die Prozedur eine autonome Transaktion ist). Dann nuke die Daten nachträglich. (Keine Notwendigkeit zur Vervielfältigung.)
Wenn dies zum Debuggen gedacht ist, empfehle ich außerdem, die Notwendigkeit einer solchen Protokollierung zu entfernen oder drastisch zu reduzieren, wenn die Dinge getestet wurden. Und wie immer testen, testen, testen Sie auf Ihrem eigenen System, um zu überprüfen, wie die Dinge funktionieren werden. (Im Kommentar von Niall finden Sie ein gutes Beispiel dafür, wie sich die Protokollierung drastisch auf die Leistung auswirkt.)
(Schließlich, weil ich es versäumt habe, es vorher zu erwähnen: Passen Sie auf autonome Transaktionen auf. Verstehen Sie sie vollständig, bevor Sie sie implementieren, und verwenden Sie sie nicht "nur weil". Sie können auf millionenfache Weise falsch verwendet werden (sagen Sie zum Beispiel zu ATTEMPT) Vermeiden Sie einen mutierten Fehler in einem Trigger.) Wenn dies nicht möglich ist, sollten Sie immer nach Alternativen suchen. Wenn dies nicht möglich ist, gehen Sie vorsichtig vor. Die Protokollierung während längerer Operationen war immer ein Fall, in dem dies ziemlich sicher war (Ignorieren) Leistungsprobleme), aber beeilen Sie sich nicht, um es auf andere Verwendungen anzuwenden, ohne die Konsequenzen zu kennen.)
quelle
Nicht in 10g verfügbar, aber DBMS_XA kann es einer Transaktion ermöglichen, mehrere Sitzungen zu durchlaufen . Auf diese Weise kann die zweite Sitzung sehen, was in der Transaktion vor sich geht
quelle
Zusätzlich zu den anderen hier aufgeführten Informationen können Sie Informationen zu einer nicht festgeschriebenen Transaktion auch per E-Mail senden oder in eine Textdatei schreiben.
quelle