Obecnie debuguję proces wsadowy, który wykonuje wiele instrukcji DML, ale nie wykonuje od razu zatwierdzenia. Byłoby miło móc zobaczyć „oczekujące” zmiany z innej sesji, gdy transakcja nie jest zatwierdzona. czy to możliwe?
Przykład:
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
contactmatt
źródło
źródło
Odpowiedzi:
Istnieje kilka różnych podejść w zależności od szczegółów procesu wsadowego i powodu, dla którego próbujesz wyświetlić niezatwierdzone zmiany.
1) Oracle Workspace Manager to narzędzie, które pierwotnie zostało zaprojektowane w celu umożliwienia osobom opracowującym aplikacje przestrzenne równoważenie niezwykle długotrwałych transakcji (tj. Transakcji, które mogą wymagać wielu dni lub tygodni od ludzi zastanawiających się, gdzie uruchomić rurociąg w jednej transakcji ). W procesie wsadowym można utworzyć nowy obszar roboczy (co logicznie przypomina tworzenie nowej transakcji), wprowadzić dowolne zmiany w tym obszarze roboczym, zatwierdzając je w dowolnym momencie. W oddzielnej sesji nie zobaczysz żadnych zatwierdzonych zmian, dopóki nie wejdziesz do obszaru roboczego procesu wsadowego. Po zakończeniu procesu wsadowego może połączyć swój obszar roboczy z powrotem z aktywnym obszarem roboczym, co jest równoważne z dokonaniem transakcji.
2) Pakiet DBMS_XA może służyć do „przekazania” transakcji z jednej sesji do drugiej oraz do umożliwienia jednej sesji połączenia z transakcją rozpoczętą przez inną sesję. Jest to dość niejasny pakiet do użycia, ale był miły przykład użycia go w PL / SQL Challenge (możesz potrzebować darmowego konta, aby uzyskać do niego dostęp) ostatnio.
3) Jeśli po prostu próbujesz zobaczyć status procesu wsadowego, a nie rzeczywiste dane, proces wsadowy może zapisać informacje rejestrowania przy użyciu autonomicznych transakcji, które możesz następnie zapytać z innej sesji. Możesz też użyć pakietu DBMS_APPLICATION_INFO, aby aplikacja zaktualizowała różne atrybuty w V $ SESSION i / lub V $ SESSION_LONGOPS, abyś mógł monitorować status obciążenia z innej sesji.
źródło
edycja: zostało napisane przed wyjaśnieniem pytania
Możesz użyć zapytań retrospektywnych, aby zobaczyć tabelę bez własnych nieproszonych danych.
Rozważać:
Aby zobaczyć różnicę między tabelą z moją transakcją a tabelą widzianą przez innych, mógłbym wydać:
źródło
Tak - LogMiner może to zrobić. W rzeczywistości, jeśli chcesz tylko zatwierdzone transakcje, musisz specjalnie filtrować dane wyjściowe! I nie ma
TABLE_NAME
wV$LOGMINER_CONTENTS
, to jak byś wyglądał w jednej tabeli.źródło
To, czego Oracle nie ma, to niezaangażowany tryb izolacji . Innymi słowy, nie będziesz w stanie wysłać zapytania o niezaangażowane dane w innej transakcji.
Istnieją sposoby na uzyskanie informacji z długoterminowej transakcji - jak dotąd nie wspomniano o transakcjach autonomicznych (z których należy zachować ostrożność)
źródło
Nie ma bezpośredniej metody; będziesz musiał albo przeanalizować dzienniki (jak wspomniano w innej odpowiedzi), albo użyć alternatywnych metod, aby zobaczyć, co dzieje się w długotrwałym procesie.
Osobiście sugeruję użycie autonomicznych transakcji, aby włączyć tę funkcję - nie w samej transakcji, ale jako mechanizm rejestrowania, który informuje Cię o tym, co się dzieje. Na przykład możesz mieć wywołanie PROCEDURE LONG_ACTION PROCEDURE WRITE_LOG_ENTRY (zdefiniowane jako transakcja autonomiczna), które zapisałoby VARCHAR2 do innej tabeli. Transakcje autonomiczne NIE zakłócają bieżącej transakcji (z perspektywy LOGICZNEJ, uważaj na potencjalny wpływ na wydajność), dzięki czemu możesz zobaczyć, co się dzieje, poprzez wpisy logowania, niezależnie od ZALECENIA lub ROLLBACK w bieżącej transakcji. To powiedziawszy, możesz to zrobić za pomocą jednej ogromnej instrukcji DML; musisz użyć pętli.
Rozważać:
Biorąc pod uwagę powyższe, otrzymasz wpis dziennika dla każdych 500 przetworzonych wierszy, niezależnie od powodzenia długiej akcji. Jeśli potrzebujesz dokładnego duplikatu danych, aby zobaczyć, jak działa, sugeruję utworzenie duplikatu tabeli i wywołanie procedury, która powieliby dane (procedura jest transakcją autonomiczną). Potem nuke dane po fakcie. (Nie ma potrzeby kopiowania).
Ponadto, jeśli jest to w celu debugowania, sugeruję usunięcie lub drastyczne zmniejszenie potrzeby takiego rejestrowania, gdy rzeczy zostały przetestowane. I jak zawsze testuj, testuj, testuj na swoim własnym systemie, aby sprawdzić, jak wszystko będzie działać. (Zobacz komentarz Nialla, aby zobaczyć dobry przykład, w jaki sposób rejestrowanie może drastycznie wpłynąć na wydajność).
(Wreszcie, ponieważ wcześniej nie wspomniałem o tym: strzeżcie się transakcji autonomicznych. Zrozumcie je w pełni przed wdrożeniem i nie używajcie ich „tylko dlatego, że”. Można ich używać na milion sposobów niepoprawnie (powiedzmy na przykład, aby PRÓBOWAĆ, aby unikaj błędu mutacji w wyzwalaczu), więc zawsze najlepiej jest znaleźć alternatywy, jeśli to możliwe. Jeśli nie możesz, postępuj ostrożnie. Rejestrowanie podczas długotrwałych operacji zawsze było jednym przypadkiem, w którym jest dość bezpieczne (ignorowanie problemy z wydajnością), ale nie spiesz się, aby zastosować go do innych zastosowań, nie znając konsekwencji.)
źródło
Niedostępne w 10 g, ale DBMS_XA może pozwolić na transakcję obejmującą wiele sesji. Korzystając z tego, druga sesja może zobaczyć, co dzieje się w transakcji
źródło
Oprócz innych informacji tutaj, dodatkowymi sposobami przesłania informacji o niezatwierdzonej transakcji byłoby wysłanie wiadomości e-mail lub zapisanie pliku tekstowego.
źródło