スランプトランザクションとは、コミット段階に入っており、かつそのトランザクションのコミット時間が一定のしきい値を超えたトランザクションを指します。
以下の手順で調査することができます。
スランプトランザクションを捕捉します。
システムテナントの
GV$OB_TRANSACTION_PARTICIPANTSビューを参照してスランプトランザクションを検索できます。スランプトランザクションが存在する場合、そのトランザクションのトランザクションID(TX_ID)、スケジューラーが存在するノード(SCHEDULER_ADDR)、およびセッションID(SESSION_ID)を取得します。SELECT count(1) FROM GV$OB_TRANSACTION_PARTICIPANTS WHERE CTX_CREATE_TIME < date_sub(now(), INTERVAL 600 SECOND) AND (STATE = 'PREPARE' OR STATE = 'REDO COMPLETE' OR STATE ='PRECOMMIT');上記の例で600sはデフォルトのトランザクションタイムアウト時間を表します。
注意
トランザクションの巡回検査を実施する前に、システム内にアクティブな所有者のいない状態が存在しないことを確認する必要があります。
そのトランザクションがXAトランザクションかどうかを判断します。トランザクションIDをフィルター条件として使用し、
V$OB_GLOBAL_TRANSACTIONビューを照会します。レコードが存在すれば、それはXAトランザクションです。そのトランザクションがXAトランザクションである場合、対応するユーザーテナントでxa rollbackを使用してトランザクションをロールバックします。通常のトランザクションである場合は、OBClientを使用して、そのトランザクションのスケジューラーが存在するノード上のシステムテナントに直接接続し、kill sessionコマンドを実行してトランザクションをロールバックできます。その後、スランプの原因をさらに分析する必要があります(考えられる原因としては、ログストリームの無主状態やディスク満杯などがあります)。