目次
はじめに
こんにちは。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の関連パラメータの値は以下になります。
★トランザクション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に関する記事はコチラ!
お問合せはコチラ!
投稿者プロフィール
- 23ai2024年12月25日【Oracle 23ai 新機能】優先トランザクションを使ってみました
- 23ai2024年12月23日【Oracle 23ai 新機能】SQL Firewallを導入してみました
- Dbvisit Standby2024年12月20日【Dbvisit Standby】チュートリアル_サポートパッケージ
- 23ai2024年12月19日【Oracle 23ai 新機能】読み取り専用ユーザを使ってみました