Ответы:
Нет, SQL Server не ведет никакой истории о транзакциях, которые были прерваны / откачены, что тривиально, чтобы добраться до и не создает дополнительных потенциальных проблем (как описано в ответе @ ooutwire ). Или даже транзакции, которые были совершены.
Вам придется вести свою собственную регистрацию в рамках обработки ошибок или захватывать определенные связанные с транзакциями события, используя трассировку на стороне сервера или расширенные события.
Трассировка:
Расширенные события:
Когда вы говорите «неудачные» транзакции, что именно вы имеете в виду?
Если вы хотите увидеть текущие транзакции в экземпляре, вы можете использовать sys.dm_tran_active_transactions
DMV.
Кроме того, sys.dm_exec_sessions
есть, open_transaction_count
что может дать вам эту информацию по сеансу. Ниже приведен диагностический запрос для извлечения всех пользовательских процессов с открытыми транзакциями:
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;
Эта информация также может быть получена из sys.dm_tran_session_transactions
:
select
session_id,
is_user_transaction,
open_transaction_count
from sys.dm_tran_session_transactions;
Если вы хотите получить данные об откате транзакций (принимая во внимание ваше желание «провалить» транзакции), вы можете захватить rollback_tran_completed
событие расширенных событий . Если вы ищете «все» представление транзакций, вы можете захватить sql_transaction
событие, которое, как определено SQL Server,
Происходит, когда транзакция SQL Server начинается, завершается, откатывается или выполняет точку сохранения. Используйте это событие для мониторинга поведения транзакции при устранении неполадок приложений, триггеров или хранимых процедур.
Вы можете использовать fn_dblog () и найти идентификаторы транзакций для прерванных транзакций, а также множество другой полезной информации.
ВЫБРАТЬ * FROM fn_dblog (NULL, NULL) WHERE Operation = 'LOP_ABORT_XACT'; ИДТИ
Он сканирует весь журнал транзакций в активной части журнала. Это можно переопределить, используя флаг трассировки 2537, который позволит вам вернуться как можно дальше к началу самого старого «неиспользованного» VLF. Будьте осторожны при использовании этой функции, поскольку она сканирует журнал случайным образом и журнал не может измениться во время сканирования; Таким образом, вы можете увидеть рост журнала.
Вы также можете использовать fn_dump_dblog для резервного файла журнала.