SQL Server 2012で失敗したトランザクションを見つけるために調べられる場所はありますか?
いいえ、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 Serverで定義されているsql_transaction
イベントをキャプチャできます。
SQL Serverトランザクションが開始、完了、ロールバック、またはセーブポイントを実行すると発生します。このイベントを使用して、アプリケーション、トリガー、またはストアドプロシージャのトラブルシューティングを行うときにトランザクションの動作を監視します。
Fn_dblog()を使用して、打ち切られたトランザクションのトランザクションIDと、その他の有用な情報のホストを見つけることができます。
SELECT * FROM fn_dblog(NULL、NULL) WHERE操作= 'LOP_ABORT_XACT'; GO
ログのアクティブな部分にあるすべてのトランザクションログをスキャンします。これは、トレースフラグ2537を使用してオーバーライドできます。これにより、最も古い「再利用されていない」VLFの先頭に可能な限り戻ることができます。この関数はログをランダムにスキャンし、スキャンの実行中にログを変更することはできないため、この関数の使用には注意してください。そのため、ログの増加が見られる場合があります。
ログバックアップファイルに対してfn_dump_dblogを使用することもできます。