Odpowiedzi:
Nie, SQL Server nie przechowuje żadnej historii transakcji, które zostały przerwane / wycofane, co jest trywialne i nie wprowadza dodatkowych potencjalnych problemów (zgodnie z odpowiedzią @ ooutwire ). A nawet transakcje, które zostały popełnione.
Będziesz musiał wykonać własne rejestrowanie w ramach obsługi błędów lub przechwycić określone zdarzenia związane z transakcją za pomocą śledzenia po stronie serwera lub zdarzeń rozszerzonych.
Ślad:
Rozszerzone wydarzenia:
Co powiesz na „nieudane” transakcje?
Jeśli chcesz zobaczyć bieżące transakcje w instancji, możesz skorzystać z sys.dm_tran_active_transactions
DMV.
Ponadto, sys.dm_exec_sessions
ma open_transaction_count
, że może dać Ci te informacje sesji. Poniżej znajduje się zapytanie diagnostyczne umożliwiające pobranie wszystkich procesów użytkownika, które mają otwarte transakcje:
select
s.session_id,
s.login_name,
s.open_transaction_count,
st.text as most_recent_sql_text
from sys.dm_exec_sessions s
inner join sys.dm_exec_connections c
on s.session_id = c.session_id
outer apply sys.dm_exec_sql_text(c.most_recent_sql_handle) st
where s.is_user_process = 1
and s.open_transaction_count > 0;
Informacje te można również pobrać z sys.dm_tran_session_transactions
:
select
session_id,
is_user_transaction,
open_transaction_count
from sys.dm_tran_session_transactions;
Jeśli chcesz przechwycić, kiedy transakcje zostały wycofane (zakładając, że tak bardzo pragniesz transakcji „nieudanych”), możesz przechwycić zdarzenie Extended Events rollback_tran_completed
. Jeśli szukasz widoku transakcji „wszystko”, możesz uchwycić sql_transaction
zdarzenie zdefiniowane przez SQL Server
Występuje, gdy transakcja SQL Server rozpoczyna się, kończy, przywraca lub wykonuje punkt zapisu. To zdarzenie służy do monitorowania zachowania transakcji podczas rozwiązywania problemów z aplikacjami, wyzwalaczami lub procedurami przechowywanymi.
Możesz użyć fn_dblog () i znaleźć identyfikatory transakcji dla przerwanych transakcji, a także wiele innych przydatnych informacji.
WYBIERZ * FN_dblog (NULL, NULL) GDZIE Operacja = „LOP_ABORT_XACT”; UDAĆ SIĘ
Skanuje wszystkie dzienniki transakcji w aktywnej części dziennika. Można to obejść za pomocą flagi śledzenia 2537, która pozwoli ci cofnąć się tak daleko, jak to możliwe, do początku najstarszego „nieużywanego” VLF. Zachowaj ostrożność podczas korzystania z tej funkcji, ponieważ skanuje ona losowo dziennik, a dziennik nie może się zmienić podczas skanowania; więc możesz zobaczyć wzrost logów.
Możesz także użyć fn_dump_dblog przeciwko plikowi kopii zapasowej dziennika.