以下のエラーが発生した場合、トランザクションのロールバックが行われたことを示します。
| 外部エラーコード | 内部エラーコード | メッセージ表示 |
|---|---|---|
| 6002 | -6224 | トランザクションのロールバックが必要です |
| 6002 | -6223 | トランザクション終了 |
| 6002 | -6211 | トランザクションがキルされました |
| 6002 | -6213 | トランザクションコンテキストが存在しません |
トランザクションのロールバックは必ずしも例外ではありません。トランザクションのタイムアウトや参加者によるリーダーの切り替えなど、いくつかのケースでトランザクションのロールバックが発生する可能性があります。
以下の状況ではリーダーの切り替えが発生します:
- メンテナンスシナリオ:replica leaderの切り替え、primary zoneの変更、serverの削除、serverの停止
- 内部スケジューリングシナリオ:ユニットの移行、レプリカのオフライン、primary zoneへのレプリカの追加
- 内部例外シナリオ:異常なリーダーの切り替え
Root Serviceによってトリガーされるリーダーの切り替えでは、システムは既存のアクティブなトランザクションに対して一定時間を確保し、その実行完了を待ちます。同時に、新しいトランザクションの開始は許可されません。時間が経過すると、依然としてアクティブなすべてのトランザクションが新しいリーダーに移行されます。その後、リーダーの切り替えが行われ、新しいリーダーがサービスを継続します。
一部のシナリオでは、リーダーの切り替えによってトランザクションが強制終了されることがあります:
- リーダーの切り替えがRootServiceによってトリガーされない場合、例えば異常なリーダーの切り替え
- 大規模トランザクションのシナリオ
- リーダーの切り替えによって新しいリーダーへのトランザクションの移行が開始された際に、ステートメントの実行がまだ完了していない場合
トランザクションのロールバックエラーが発生した場合、ビューDBA_OB_SERVER_EVENT_HISTORYを使用してリーダーの切り替えが発生したかどうかを確認できます。以下の例は、switch replica leaderコマンドによってトリガーされるリーダーの切り替えプロセスを示しています。
リーダーの切り替え前のログストリームのリーダー分布を照会します。
obclient> select TENANT_ID,LS_ID,SVR_IP,SVR_PORT,ROLE,PAXOS_MEMBER_LIST from GV$OB_LOG_STAT where tenant_id=1 and ls_id=1; +-----------+-------+-------------+----------+----------+---------------------------------------------------------------------------+ | TENANT_ID | LS_ID | SVR_IP | SVR_PORT | ROLE | PAXOS_MEMBER_LIST | +-----------+-------+-------------+----------+----------+---------------------------------------------------------------------------+ | 1 | 1 | xx.xx.xx.158| 2882 | FOLLOWER | xx.xx.xx.43:2882:1686125578254268,xx.xx.xx.106:2882:1,xx.xx.xx.158:2882:1 | | 1 | 1 | xx.xx.xx.43 | 2882 | FOLLOWER | xx.xx.xx.43:2882:1686125578254268,xx.xx.xx.106:2882:1,xx.xx.xx.158:2882:1 | | 1 | 1 | xx.xx.xx.106| 2882 | LEADER | xx.xx.xx.43:2882:1686125578254268,xx.xx.xx.106:2882:1,xx.xx.xx.158:2882:1 | +-----------+-------+-------------+----------+----------+---------------------------------------------------------------------------+ 3 rows in set (0.01 sec)リーダーの切り替えアクションを実行します。
obclient> alter system switch replica leader ls=1 server='xx.xx.xx.158:2882' tenant='sys'; Query OK, 0 rows affected (0.01 sec)ログストリームの選択イベントを照会します。
obclient> SELECT VALUE4 HAPPENED_TIME,svr_ip,VALUE1 TENANT_ID,VALUE2 LS_ID,event,name3,value3 FROM DBA_OB_SERVER_EVENT_HISTORY WHERE module="ELECTION"; +----------------------------+-------------+-----------+-------+---------------------------+-------+------------------------------------------------------------------------------------------------------------------+ | HAPPENED_TIME | svr_ip | TENANT_ID | LS_ID | event | name3 | value3 | +----------------------------+-------------+-----------+-------+---------------------------+-------+------------------------------------------------------------------------------------------------------------------+ | 2023-06-12 23:27:23.291335 | xx.xx.xx.106| 1 | 1 | prepare change leader | INFO | leader prepare to change leader : "xx.xx.xx.106:2882" -> "xx.xx.xx.158:2882", reason : MANUAL LEADER | | 2023-06-12 23:27:23.294363 | xx.xx.xx.158| 1 | 1 | change leader to takeover | INFO | new leader takeover : "xx.xx.xx.106:2882" -> "xx.xx.xx.158:2882" | | 2023-06-12 23:27:23.318691 | xx.xx.xx.43 | 1 | 1 | witness change leader | INFO | witness change leader : "xx.xx.xx.106:2882" -> "xx.xx.xx.158:2882" | | 2023-06-12 23:27:23.292954 | xx.xx.xx.106| 1 | 1 | change leader to revoke | INFO | old leader revoke : "xx.xx.xx.106:2882" -> "xx.xx.xx.158:2882" | | 2023-06-12 23:27:23.541978 | xx.xx.xx.158| 1 | 1 | witness change leader | INFO | witness change leader : "xx.xx.xx.106:2882" -> "xx.xx.xx.158:2882" | | 2023-06-12 23:27:23.542136 | xx.xx.xx.106| 1 | 1 | witness change leader | INFO | witness change leader : "xx.xx.xx.106:2882" -> "xx.xx.xx.158:2882" | +----------------------------+-------------+-----------+-------+---------------------------+-------+------------------------------------------------------------------------------------------------------------------+ 6 rows in set (0.02 sec)