Получите транзакции, которые не прошли или не были совершены

Ответы:

5

Нет, SQL Server не ведет никакой истории о транзакциях, которые были прерваны / откачены, что тривиально, чтобы добраться до и не создает дополнительных потенциальных проблем (как описано в ответе @ ooutwire ). Или даже транзакции, которые были совершены.

Вам придется вести свою собственную регистрацию в рамках обработки ошибок или захватывать определенные связанные с транзакциями события, используя трассировку на стороне сервера или расширенные события.

Трассировка:

введите описание изображения здесь

Расширенные события:

введите описание изображения здесь

Аарон Бертран
источник
Конечно, они находятся в файле журнала и журнале резервных копий.
ooutwire
1
@ ooutwire, и как ты легко добираешься до них? И как вы к ним попадете, если их больше нет в журнале? Эти записи журнала в лучшем случае являются временными.
Аарон Бертран
Смотри мой ответ. Лучший способ - создавать частые резервные копии журналов. Я согласен, что такое решение не является идеальным; но я не вижу причин, по которым я все время буду искать в prod прерванные транзакции. Если это желание, то след или XEvent может показаться разумным решением.
ooutwire
2
Я видел твой ответ, конечно. Я сказал легко, а также должен был сказать надежно . :-)
Аарон Бертран
6
Я с @AaronBertrand на этот раз. С трудностями, которые потребуются для прочесывания журналов транзакций ( Примечание: не для чего они предназначены ), вы могли бы просто создать облегченный сеанс XE для этого устранения неполадок.
Томас Стрингер
4

Когда вы говорите «неудачные» транзакции, что именно вы имеете в виду?

Если вы хотите увидеть текущие транзакции в экземпляре, вы можете использовать sys.dm_tran_active_transactionsDMV.

Кроме того, 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 начинается, завершается, откатывается или выполняет точку сохранения. Используйте это событие для мониторинга поведения транзакции при устранении неполадок приложений, триггеров или хранимых процедур.

Томас Стрингер
источник
4

Вы можете использовать fn_dblog () и найти идентификаторы транзакций для прерванных транзакций, а также множество другой полезной информации.

ВЫБРАТЬ * 
FROM fn_dblog (NULL, NULL)
WHERE Operation = 'LOP_ABORT_XACT';
ИДТИ

Он сканирует весь журнал транзакций в активной части журнала. Это можно переопределить, используя флаг трассировки 2537, который позволит вам вернуться как можно дальше к началу самого старого «неиспользованного» VLF. Будьте осторожны при использовании этой функции, поскольку она сканирует журнал случайным образом и журнал не может измениться во время сканирования; Таким образом, вы можете увидеть рост журнала.

Вы также можете использовать fn_dump_dblog для резервного файла журнала.

ooutwire
источник