長時間トランザクションとは、トランザクションの実行時間が一定のしきい値(アプリケーション層で定義)を超え、かつコミットされていない状態を指します。このしきい値は通常、トランザクションのタイムアウト時間(テナントシステム変数 ob_trx_timeout によって制御され、トランザクションの実行時間がこのタイムアウト時間を超えると自動的にロールバックされ、リソースが解放されます)よりも短く設定されます。これは、アプリケーション層がトランザクションの過度な長時間化やシステムリソースの占有を防ぐための監視手段です。
長時間トランザクション/ハングトランザクションの弊害:
- アクティブなトランザクションはMemTableの参照を保持しており、トランザクションが長時間終了しない場合、MemTableが凍結された後に解放されず、メモリが上限になる可能性があります。
- アクティブなトランザクションが行ロックを保持していると、その行ロックが解放されなくなります。他のトランザクションがその行ロックを待機することで、トランザクションが長時間待機したり、トランザクションがタイムアウトしてロールバックされたりする可能性があります。
長時間トランザクション/ハングトランザクションのアラートが発生した場合は、直ちに原因を確認し、リスクを迅速に排除する必要があります。
以下の手順で調査を行うことができます。
長時間トランザクションをキャプチャします。
システムテナントの
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 = 'INIT';上記の例での600sはデフォルトのトランザクションタイムアウト時間を表しており、アプリケーション層はシナリオに応じて自由に調整できます。
注意
トランザクション巡回検査の前に、システム内にプレイヤーが存在しないことを確認する必要があります。
そのトランザクションがXAトランザクションであるかどうかを判断し、トランザクションIDをフィルタ条件として
V$OB_GLOBAL_TRANSACTIONビューを照会します。レコードが存在する場合、それはXAトランザクションです。そのトランザクションがXAトランザクションである場合、対応するユーザーテナントでxa rollbackを使用してトランザクションをロールバックします。通常のトランザクションの場合は、OBClientを使用して、そのトランザクションのスケジューラーが存在するノード上のシステムテナントに直接接続し、kill sessionを使用してトランザクションをロールバックします。
運用上の推奨事項:
トランザクションの実行時間が長くなりすぎるとシステムの安定性に影響を与えるため、文のタイムアウト時間(テナントシステム変数 ob_query_timeout のデフォルトは10秒)とトランザクションのタイムアウト時間(テナントシステム変数 ob_trx_timeout のデフォルトは100秒)を長く設定することは推奨されません。