回答:
いいえ、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()を使用して、中止されたトランザクションのトランザクションIDや、その他の役立つ情報を見つけることができます。
選択する * FROM fn_dblog(NULL、NULL) WHEREオペレーション= 'LOP_ABORT_XACT'; 行く
ログのアクティブな部分にあるすべてのトランザクションログをスキャンします。これは、トレースフラグ2537を使用してオーバーライドできます。これにより、最も古い「再利用されていない」VLFの先頭に可能な限り戻ることができます。この関数はログをランダムにスキャンし、スキャンの実行中にログを変更できないため、この関数を使用するときは注意してください。そのため、ログの増加が見られる場合があります。
ログバックアップファイルに対してfn_dump_dblogを使用することもできます。