5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ADB-SにおけるTransparent Application Continuity(TAC)を適用する際に注意したいPL/SQLパターン

5
Last updated at Posted at 2026-01-26

目次

1.はじめに
2.本文
3.まとめ

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は万能ではありませんが、「適用できる前提」を理解すれば非常に強力な機能です。
同様の構成で検証・設計される方の参考になれば幸いです。

5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?