はじめに

こんにちは。Oracle Databaseの検証チームです。
今回は、Oracle Database 23aiの新機能である「優先トランザクション」をご紹介いたします。

今回の執筆者は【Oracle 23ai 新機能】読み取り専用ユーザを使ってみましたを執筆しています。
同じく23ai 新機能なので是非チェックしてみてくださいね。

優先トランザクションについて

トランザクションとは

トランザクションとは、データベース内でデータの整合性を保つため、
関連する操作を1つのまとまった処理として取り扱う仕組みのことです。

操作が正常に行われた場合には、変更を確定させ(COMMIT)、
操作の途中で問題があった場合には、処理を取り消します(ROLLBACK)。

行ロックとは

行ロックとは、データベース(のテーブル)のデータを更新するときなどに、対象のレコード(データ行)のみをロックすることです。
トランザクションがCOMMITされるかROLLBACKされるまで保持されます。

優先トランザクションとは

今までは、あるトランザクションが別のトランザクションによる行ロックによって長時間ブロックされると、
データベース管理者が「ALTER SYSTEM KILL SESSION」コマンドを使用し、
手動でブロックされているトランザクションを終了させる必要がありました。

ただOracle Database 23aiから、
行ロックを保持しているトランザクションを自動的にロールバックできる機能と、
その動作を制御するパラメータが導入されました。

それにより、トランザクションの優先度を指定できるようになり、
優先度の高いトランザクションが優先度の低いトランザクションによる行ロックによってブロックされると、
優先度の低いトランザクションは自動的にロールバックされ、優先度の高いトランザクションが進行するようになります。

優先トランザクションで使用するパラメータについて

優先トランザクションの機能を使用するには、2タイプのパラメータを設定する必要があります。
ここでは各設定で使用するパラメータについてご紹介いたします。

トランザクション優先度の設定

1つ目は、トランザクション優先度の設定です。
トランザクション優先度は、「ALTER SESSION」コマンドを使用してセッション・レベルで設定します。

パラメータは、TXN_PRIORITYで、有効な値は、LOW,MEDIUM,HIGHです。
優先度は、LOW < MEDIUM < HIGH となっています。

 

SQL> col name  for a50
SQL> col value for a15
SQL> select name, value from v$parameter where name like 'txn_priority';

NAME                                               VALUE
-------------------------------------------------- ---------------
txn_priority                                       HIGH

トランザクション優先度のデフォルト値はHIGHです

 

では、実際にトランザクション優先度の設定を行います。

SQL> alter session set "txn_priority" = "MEDIUM";

Session altered.

SQL>
SQL> select name, value from v$parameter where name like 'txn_priority';

NAME                                               VALUE
-------------------------------------------------- ---------------
txn_priority                                       MEDIUM

現在のセッションでのすべてのトランザクションの優先度を「MEDIUM」に設定できました。

 

ちなみに、再度接続し直すと、値は「HIGH」に戻っていることが確認できました。

[oracle@basedb-tky ~]$ sqlplus / as sysdba

省略

Connected to:
Oracle Database 23ai Enterprise Edition Release 23.0.0.0.0 - for Oracle Cloud
Version 23.4.1.24.06

SQL> 
SQL> col name for a50
SQL> col value for a15
SQL> select name, value from v$parameter where name like 'txn_priority';

NAME                                               VALUE
-------------------------------------------------- ---------------
txn_priority                                       HIGH

 

システム・レベルの待機ターゲットの設定

2つ目は、システム・レベルの待機ターゲットの設定です。
この設定では、行ロックを保持するトランザクションを自動的にロールバックするまでの時間を制御します。

パラメータは、PRIORITY_TXNS_HIGH_WAIT_TARGET, PRIORITY_TXNS_MEDIUM_WAIT_TARGETで、
値は、「優先度高(HIGH)および中(MEDIUM)のトランザクションがそれよりも低い優先度のトランザクションによる行ロックによってブロックされるとき、
低い優先度のトランザクションをロールバックするまでの
最大待機時間(秒)
」を指定します。

 

SQL> select name, value from v$parameter where name like 'priority_txns_high_wait_target';

NAME                                               VALUE
-------------------------------------------------- ---------------
priority_txns_high_wait_target                     2147483647

SQL> 
SQL> select name, value from v$parameter where name like 'priority_txns_medium_wait_target';

NAME                                               VALUE
-------------------------------------------------- ---------------
priority_txns_medium_wait_target                   2147483647

システム・レベルの待機ターゲットのデフォルト値は「2147483647」です。

 

では、実際にシステム・レベルの待機ターゲットの設定を行います。

SQL> alter system set "priority_txns_high_wait_target" = 20;

System altered.

SQL> 
SQL> alter system set "priority_txns_medium_wait_target" = 20;

System altered.

SQL> 
SQL> select name, value from v$parameter where name like 'priority_txns_high_wait_target';

NAME                                               VALUE
-------------------------------------------------- ---------------
priority_txns_high_wait_target                     20

SQL> 
SQL> select name, value from v$parameter where name like 'priority_txns_medium_wait_target ';

NAME                                               VALUE
-------------------------------------------------- ---------------
priority_txns_medium_wait_target                   20

最大待機時間(秒)を「20(秒)」に設定できました。

 

優先トランザクションモードの設定

優先トランザクションモードの設定では、行ロックによって優先度が高いトランザクションをブロックした際に、どのような動作を実行するか選択できます。

パラメータは、PRIORITY_TXNS_MODEで、有効な値は、ROLLBACK,TRACKです。

「ROLLBACKモード」は、「PRIORITY_TXNS_HIGH_WAIT_TARGET」と「PRIORITY_TXNS_MEDIUM_WAIT_TARGET」が適切に構成されている場合、
優先度の高いトランザクションが優先度の低いトランザクションによる行ロックによってブロックされると、
優先度の低いトランザクションは自動的にロールバックされ、優先度の高いトランザクションが進行します。

「TRACKモード」は、データベース管理者が優先トランザクションの機能を試すことができるモードになっています。
実際にトランザクションをロールバックする代わりに、
ロールバックされたトランザクションの数が反映されるように、次の統計のみを増分します。

  • TXNS TRACK MODE PRIORITY_TXNS_HIGH_WAIT_TARGET
  • TXNS TRACK MODE PRIORITY_TXNS_MEDIUM_WAIT_TARGET

例えば、優先度がHIGHのトランザクションによって、優先度MEDIUMまたはLOWのトランザクションがロールバックされた場合、
TXNS TRACK MODE PRIORITY_TXNS_HIGH_WAIT_TARGETが増分されます。

 

SQL> select name, value from v$parameter where name like 'priority_txns_mode';


NAME                                               VALUE
-------------------------------------------------- ---------------
priority_txns_mode                                 ROLLBACK

優先トランザクションモードのデフォルト値はROLLBACKです。

 

では、実際に優先トランザクションモードの設定を行います。

SQL> alter system set "priority_txns_mode" = "TRACK";

System altered.

SQL> select name, value from v$parameter where name like 'priority_txns_mode';

NAME                                               VALUE
-------------------------------------------------- ---------------
priority_txns_mode                                 TRACK

優先トランザクションモードを「TRACK」に設定できました。
このTRACKモードを使用して正しい待機ターゲット値を調整してから、
ROLLBACKモードに切り替え、優先トランザクションを使用できます。

優先トランザクションの検証

ここからは、実際に優先トランザクションの検証を行います。

手順の流れ

今回は以下のような流れで検証していきます。

    1. 関連パラメータの確認
    2. テーブルの作成
    3. テーブルの値の更新

関連パラメータの確認

検証前に関連パラメータを確認します。

トランザクション1の関連パラメータの値は以下になります。

★トランザクション1
SQL> select name, value from v$parameter where name like 'txn_priority';

NAME                                               VALUE
-------------------------------------------------- ---------------
txn_priority                                       LOW

SQL> 
SQL> select name, value from v$parameter where name like 'priority_txns_high_wait_target';

NAME                                               VALUE
-------------------------------------------------- ---------------
priority_txns_high_wait_target                     20

SQL> 
SQL> select name, value from v$parameter where name like 'priority_txns_medium_wait_target';

NAME                                               VALUE
-------------------------------------------------- ---------------
priority_txns_medium_wait_target                   20

SQL> 
SQL> select name, value from v$parameter where name like 'priority_txns_mode';

NAME                                               VALUE
-------------------------------------------------- ---------------
priority_txns_mode                                 ROLLBACK

トランザクション2の関連パラメータの値は以下になります。

★トランザクション2
SQL> select name, value from v$parameter where name like 'txn_priority';

NAME                                               VALUE
-------------------------------------------------- ---------------
txn_priority                                       HIGH

SQL> 
SQL> select name, value from v$parameter where name like 'priority_txns_high_wait_target';

NAME                                               VALUE
-------------------------------------------------- ---------------
priority_txns_high_wait_target                     20

SQL> 
SQL> select name, value from v$parameter where name like 'priority_txns_medium_wait_target';

NAME                                               VALUE
-------------------------------------------------- ---------------
priority_txns_medium_wait_target                   20

SQL> 
SQL> select name, value from v$parameter where name like 'priority_txns_mode';

NAME                                               VALUE
-------------------------------------------------- ---------------
priority_txns_mode                                 ROLLBACK

 

テーブルの作成

次に、検証するテーブル(テーブル名:test)を作成します。

★トランザクション1
SQL> create table TEST (VALUE VARCHAR2(10));

Table created.

SQL> 
SQL> insert into test values(1);

1 row created.

SQL> 
SQL> commit;

Commit complete.

SQL> 
SQL> select * from test;

VALUE
---------------
1

 

テーブルの値の更新

次に、テーブル「test」の値を更新します。
トランザクション1では、値を「0」へ更新、トランザクション2では、値を「2」へ更新します。

★トランザクション1
SQL> set timing on
SQL> update test set value=0;

1 row updated.

Elapsed: 00:00:00.01
SQL> 
SQL> select * from test;

VALUE
---------------
0
★トランザクション2
SQL> set timing on
SQL> update test set value=2;

1 row updated.

Elapsed: 00:00:19.99
SQL> 
SQL> select * from test;

VALUE
---------------
2

優先度「HIGH」のトランザクション2が、優先度「LOW」のトランザクション1による行ロックによってブロックされ、
優先度の高いトランザクション2が進行しました。

また、システム・レベルの待機ターゲットに設定している「20秒」を待った後、進行していることが確認できました。

 

★トランザクション1
SQL> select * from test;

VALUE
---------------
1

その後、トランザクション1でテーブル「test」をselectすると、値は「1」となっていることから、
トランザクション1は自動的にロールバックされたことも確認できました。

おわりに

今回は優先トランザクションの機能について紹介・検証してみました。
この機能を使用する際は、ぜひ上記を参考に設定していただけますと幸いです。

最後までお読みいただきありがとうございました。

Oracle 23aiに関する記事はコチラ
お問合せはコチラ

投稿者プロフィール

技術チーム
技術チーム
DBひとりでできるもんを盛り上げるべく、技術チームが立ち上がり早6年。ひとりでできるもんと言いつつ、技術者が読んでプッとなるような、極めてピンポイントでマニアックな技術ネタを執筆しています!