本記事では Oracle AI Database 26ai の新機能である Priority Transaction の機能を検証しています。
Priority Transaction とは?
Priority Transaction はセッションの設定により、トランザクションの実行に優先順位を制御する機能です。高い優先順位(Priority)を持つトランザクションが、低い優先順位を持つトランザクションの確定を待っている場合、一定時間で低い優先順位のトランザクションを自動的にロールバックします。関連する初期化パラメーターは以下の通りです。
| 初期化パラメーター | 説明 | デフォルト値 |
|---|---|---|
| priority_txns_mode | 低優先順位トランザクションの挙動 | ROLLBACK |
| priority_txns_high_wait_target | 高優先順位トランザクションの最大待ち時間 | 2147483647 |
| priority_txns_medium_wait_target | MEDIUM優先順位トランザクションの最大待ち時間 | 2147483647 |
| txn_priority | トランザクションの優先順位 | HIGH |
初期化パラメーター priority_txns_mode は競合が発生した場合の動作を決定します。この初期化パラメーターを TRACK に指定すると、競合の検知のみ行います。
トランザクションの優先順位を決める初期化パラメーター txn_priority はセッション単位で変更できます。指定できる値は HIGH, MEDIUM, LOW の3種類です。以下の例ではカレントセッションの初期化パラメーターを変更しています。
SQL> ALTER SESSION SET txn_priority = 'MEDIUM';
Session altered.
初期化パラメーター txn_priority のデフォルト値は HIGH で、この値を維持するセッションではトランザクションは破棄(ロールバック)されません。この初期化パラメーター MEDIUM を設定されたセッションでは、HIGH を設定されたセッションのトランザクションに優先権を奪われる可能性があります。
Priority Transaction の動作検証
Priority Transaction の動作を検証します。
準備
トランザクションの競合を待機する時間は、初期化パラメータ ー priority_txns_high_wait_target と、priority_txns_medium_wait_target で秒数を指定します。優先順位 HIGH のトランザクションは txn_auto_rollback_high_priority_wait_target で指定した秒数を待って、MEDIUM / LOW トランザクションを破棄します。
検証環境ではそれぞれの初期化パラメーターを 10 秒に指定します。以下に設定例を示します。
SQL> ALTER SYSTEM SET priority_txns_high_wait_target = 10;
System altered.
SQL> ALTER SYSTEM SET priority_txns_medium_wait_target = 10;
System altered.
SQL> SHOW PARAMETER priority_txns
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
priority_txns_high_wait_target integer 10
priority_txns_medium_wait_target integer 10
priority_txns_mode string ROLLBACK
競合を発生させるためのテーブルを用意します。
SQL> CREATE TABLE data1(col1 NUMBER PRIMARY KEY, col2 VARCHAR2(10));
Table created.
SQL> INSERT INTO data1 SELECT LEVEL col1, 'data1' col2 FROM DUAL CONNECT BY LEVEL <= 1000;
1000 rows created.
SQL> COMMIT;
Commit complete.
実行
低い優先順位を持つセッションが UPDATE 文を実行します。
SQL> ALTER SESSION SET txn_priority = 'MEDIUM';
Session altered.
SQL> UPDATE data1 SET col2='UpdMed' WHERE col1 = 1000;
1 row updated.
競合するセッションは無いので、すぐに実行されます。SQL*Plus の自動コミットはデフォルトでオフなので確定(COMMIT)していません。
高優先順位を持つセッションが競合する UPDATE 文を実行します。priority_txns_high_wait_target で指定された秒数(今回は 10 秒)待ってから実行されます。
SQL> UPDATE data1 SET col2='UpdHigh' WHERE col1 = 1000; ← 10 秒待機
1 row updated.
低優先順位のセッションでは、テーブルを検索したり、COMMIT 文を実行するとエラー「ORA-63302」と「ORA-63300」が発生します。ROLLBACK 文の実行が必要になります。
SQL> SELECT * FROM data1 WHERE col1 = 1000;
SELECT * FROM data1 WHERE col1 = 1000
*
ERROR at line 1:
ORA-63302: Transaction must roll back
ORA-63300: Transaction is automatically rolled back since it is blocking a
higher priority transaction from another session.
Help: https://docs.oracle.com/error-help/db/ora-63302/
SQL> ROLLBACK;
Rollback complete.
V$TRANSACTION 動的パフォーマンス・ビューを確認すると、強制ロールバックされた優先順位 MEDIUM のトランザクションがなくなっていることが確認できます。
SQL> SELECT t.TXN_PRIORITY, t.PRIORITY_TXNS_WAIT_TARGET FROM v$transaction t;
TXN_PRI PRIORITY_TXNS_WAIT_TARGET
------- -------------------------
HIGH 10
低優先順位のトランザクションがキャンセルされた場合、アラートログには以下のログが出力されました。
ORCLPDB1(3):Transaction (sid: 150, serial: 61414, xid: 4.30.920, txn_priority: "MEDIUM")
terminated by transaction (sid: 12, serial: 18803, xid: xid not available,
txn_priority: "HIGH") because of the parameter "priority_txns_high_wait_target = 10".
注意点
エラー発生が限定される
理由はわかりませんが、検証環境では低優先順位のトランザクションに関するエラー「ORA-63302」は、セッション初回のトランザクション以外では発生しませんでした。ただし、高優先順位のトランザクションによる強制ロールバック自体は動作しています。これが SQL*Plus の問題なのか仕様なのかは不明です。
似た初期化パラメーターがある
Oracle AI Database 26ai には初期化パラメーター txn_auto_rollback_high_priority_wait_target およびtxn_auto_rollback_medium_priority_wait_target があります。しかしこれらは Oracle Database 23ai の頃に使われていたものなので変更しても効果がありません。
Author: Noriyoshi Shinoda / Date: June 19, 2026