一時停止トランザクションとは、コミット段階に入り、かつトランザクションのコミット時間が一定のしきい値を超えたトランザクションを指します。
以下の手順で調査することができます。
一時停止トランザクションをキャプチャします。
システムテナントの
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を実行してトランザクションをロールバックできます。その後、一時停止の原因をさらに分析する必要があります(考えられる原因には、ログストリームのプライマリなし、ディスク容量上限などが含まれます)。