目次
1. はじめに
ADB-Sでは、Transparent Application Continuity(TAC) を有効化することで、
✅セッション切断時の自動再接続
✅未完了トランザクションの自動再実行
が可能になります。
一方で、すべてのPL/SQL処理が無条件に再実行できるわけではありません。
本記事では、
TACを有効化した環境で特定のPL/SQLパターンが再実行できずに停止するケースを、実際の検証結果とエラーメッセージをもとに整理します。
2. 本文
2.1【検証手順】
(1) トランザクションを発生させるPL/SQL作成(run_mixed_workload)
(2) TACが有効の状態でPL/SQLを実行し、実行途中で疑似障害を発生させて挙動確認
2.2【検証手順詳細】
検証環境と前提
✅Autonomous AI Database Serverless(ADB-S)
✅利用ユーザー
tacuser:PL/SQL実行用
admin:疑似障害発生用
✅TeraTermを2セッション起動し、別端末として操作
(1) トランザクションを発生させるPL/SQL作成(run_mixed_workload)
✅プロシージャの作成手順・テーブル定義は以下の記事を利用しています。
✅tacuserで作成する
(2) TACが有効の状態で、PL/SQL実行している途中で疑似障害を発生させて挙動確認
■端末(teraterm)1より
✅adminユーザーでログイン
✅TACの設定を確認する
✅FAILOVER_TYPEが[AUTO]であること
[oracle@adb-hol-dev-vcn ~]$ sqlplus admin/xxxxx@inbetest005_tp
SQL> set pages 9999
SQL> set lines 200
SQL> col NAME for a60
SQL> col FAILOVER_TYPE for a10
SQL> SELECT name, failover_type FROM DBA_SERVICES;
NAME FAILOVER_TYPE
------------------------------------------------------------ ---------------
SYAxxxxx_INBETEST005_tp.adb.oraclecloud.com AUTO
■端末(teraterm)2より
✅tacuserでログイン
✅PL/SQL実行
[oracle@adb-hol-dev-vcn ~]$ sqlplus tacuser/xxxxx@inbetest005_tp
SQL> BEGIN
2 run_mixed_workload(300);
3 END;
4 /
■端末(teraterm)1より
✅tacuserユーザーで実行しているPL/SQLを止める
SQL> select sid, serial#, username,service_name,failed_over,module
2 from v$session
3 where username = 'TACUSER' and module = 'TEST_WORKLOAD';
SID SERIAL# USERNAME SERVICE_NAME FAILED_OVER MODULE
---------- ---------- ---------- -------------------------------------------------- --------------- ---------------
29466 15616 TACUSER SYA6xxxxx_INBETEST005_tp.adb.oraclecloud.com NO TEST_WORKLOAD
SQL> alter system kill session '29466,15616';
System altered.
■端末(teraterm)2より
✅エラーが出力されて、PL/SQLが停止する
BEGIN * ERROR at line 1:
ORA-41408: embedded COMMIT in last call; failover cannot continue
ORA-06512: at "SYS.DBMS_APP_CONT_PRVT", line 60
ORA-06512: at "SYS.DBMS_APP_CONT_PRVT", line 132
ORA-06512: at line 1 Help: https://docs.oracle.com/error-help/db/ora-41408/
ORA-41408の意味(要約)
最後のコールにCOMMITが埋め込まれていました。
フェイルオーバーを続行できません
原因はOracleサーバー・プロセスはトランザクションのコミット後に失敗しましたが、COMMITはストアド・プロシージャに埋め込まれており、そのストアド・プロシージャが完了したことを保証できません。フェイルオーバーを続行できません。
ORA-06512の意味(要約)
これはPL/SQLコードのどこで問題が発生したかを示します。
つまり、
👉多重ループ内でループ内COMMITを実行
👉障害発生時に「どこまで完了したか」を Oracleサーバープロセスが再現できない
👉結果として安全側に倒して処理を中断
という挙動になります。
これはTACが失敗したのではなく、整合性を守るために正しく止まった。と解釈できます。
3. まとめ
本検証により、以下が確認できました。
✅TACが有効であっても、PL/SQLの構造によっては再実行できない
✅特に、「多重ループ+ループ内COMMIT」は再実行不可パターン(※本検証で使用したPL/SQL)
✅Oracleサーバープロセスはデータ不整合を避けるため、エラーを返して安全に停止する
また、
TACでは1つのデータベースに対し最後に1回だけCOMMITする一般的なオンライン・トランザクション処理ならコード変更なしで適用可能
とされていますが
注意を要するパターンがあります。
以下の資料より、詳細のご確認をお願い致します。
TACは万能ではありませんが、「適用できる前提」を理解すれば非常に強力な機能です。
同様の構成で検証・設計される方の参考になれば幸いです。