DML文とトランザクションについて

データ操作言語(DML)文は、データベース表のデータを追加、変更および削除します。トランザクションとは、Oracle AI Databaseが1つの単位として扱う1つ以上のSQL文で、すべての文が実行される場合と実行される場合です。

トランザクション制御文について

トランザクションとは、Oracle AI Databaseが1つの単位として扱う1つ以上のSQL文で、すべての文が実行される場合と実行される場合です。複数の操作を1つの単位として実行する必要があるため、ビジネス・プロセスのモデル化にはトランザクションが必要です。

たとえば、マネージャが退職する場合、表にJOB_HISTORY表に行を挿入してマネージャが退職すると表示し、そのマネージャにレポートする全従業員はEMPLOYEES表内でMANAGER_IDの値を更新する必要があります。アプリケーションでこのプロセスをモデル化するには、INSERT文およびUPDATE文を1つのトランザクションにグループ化する必要があります。

基本的なトランザクション制御文には次のものがあります。

SQL*Plus環境では、SQL>プロンプトでトランザクション制御文を入力できます。

SQL Developer環境では、ワークシートにトランザクション制御文を入力できます。SQL Developerには、「変更のコミット」および「変更のロールバック」アイコンもあります。詳細は、「トランザクションのコミット」および「トランザクションのロールバック」を参照してください。

注意:

明示的にトランザクションをコミットせずプログラムが異常終了した場合、データベースはコミットされていないトランザクションを自動的にロールバックします。

トランザクションは、アプリケーション・プログラムでコミットするかロールバックして明示的に終了することをお薦めします。

関連情報:

トランザクションのコミット

トランザクションをコミットすると、そのトランザクションの変更を確定して、セーブポイントを消去しロックを解除します。

トランザクションを明示的にコミットするには、COMMIT文または(SQL Developer環境で)「変更のコミット」アイコンを使用します。

ノート: Oracle AI Databaseは、データ定義言語(DDL)文の前後に暗黙的なCOMMIT文を発行します。DDL文の詳細は、「データ定義言語(DDL)文」を参照してください。

コミット前のトランザクションは次のようになります。

コミット後のトランザクションは、次のようになります。

例3-1では、REGIONS表に1行追加し(単純なトランザクション)、結果を確認してから、トランザクションをコミットします。

例3-1トランザクションのコミット

トランザクション前:

SELECT * FROM REGIONS
ORDER BY REGION_ID;

結果:

 REGION_ID REGION_NAME
---------- -------------------------
         1 Europe
         2 Americas
         3 Asia
         4 Middle East and Africa

4 rows selected.

トランザクション(表に行を追加)を実行します。

INSERT INTO regions (region_id, region_name) VALUES (5, 'Africa');

結果:

1 row created.

追加した行を確認します。

SELECT * FROM REGIONS
ORDER BY REGION_ID;

結果:

 REGION_ID REGION_NAME
---------- -------------------------
         1 Europe
         2 Americas
         3 Asia
         4 Middle East and Africa
         5 Africa

5 rows selected.

トランザクションをコミットします。

COMMIT;

結果:

Commit complete.

関連項目: COMMIT文の詳細は、『Oracle AI Database SQL言語リファレンス』を参照してください。

トランザクションのロールバック

トランザクションのロールバックでは変更は取り消されます。トランザクション全体をロールバックするか、指定したセーブポイントまでロールバックすることができます。

指定したセーブポイントまで現在のトランザクションをロールバックするには、TO SAVEPOINT句を使用するROLLBACK文を使用する必要があります。

現在のトランザクション全体をロールバックするには、TO SAVEPOINT句を指定せずにROLLBACK文を使用するか、または(SQL Developer環境で)「変更のロールバック」アイコンを使用します。

現在のトランザクション全体のロールバック

指定したセーブポイントまで現在のトランザクションをロールバック

SQL Developerでのロールバックの影響を確認するには、「リフレッシュ」アイコンをクリックする必要がある場合があります。

例3-1の結果、REGIONS表には「Middle East and Africa」というリージョンと「Africa」という地域があります。例3-2では、この問題を修正(単純なトランザクション)して変更を確認した後、トランザクションをロールバックし、ロールバックされたことをチェックします。

例3-2トランザクション全体のロールバック

トランザクション前:

SELECT * FROM REGIONS
ORDER BY REGION_ID;

結果:

 REGION_ID REGION_NAME
---------- -------------------------
         1 Europe
         2 Americas
         3 Asia
         4 Middle East and Africa
         5 Africa

5 rows selected.

トランザクション(表の変更)を実行します。

UPDATE REGIONS
SET REGION_NAME = 'Middle East'
WHERE REGION_NAME = 'Middle East and Africa';

結果:

1 row updated.

変更を確認します。

SELECT * FROM REGIONS
ORDER BY REGION_ID;

結果:

 REGION_ID REGION_NAME
---------- -------------------------
         1 Europe
         2 Americas
         3 Asia
         4 Middle East
         5 Africa

5 rows selected.

トランザクションをロールバックします。

ROLLBACK;

結果:

Rollback complete.

ロールバックを確認します。

SELECT * FROM REGIONS
ORDER BY REGION_ID;

結果:

 REGION_ID REGION_NAME
---------- -------------------------
         1 Europe
         2 Americas
         3 Asia
         4 Middle East and Africa
         5 Africa

5 rows selected.

関連項目: ROLLBACK文の詳細は、『Oracle AI Database SQL言語リファレンス』を参照してください

トランザクションのセーブポイントの設定

SAVEPOINT文は、トランザクションにセーブポイントをマークします。これは、後でロールバックできます。セーブポイントはオプションで、1つのトランザクションで複数のセーブポイントを設定できます。例3-3では、複数のDML文と複数のセーブポイントがあるトランザクションが実行された後、あるセーブポイントへトランザクションをロールバックして、そのセーブポイント以降に行われた変更のみを元に戻します。

例3-3セーブポイントへのトランザクションのロールバック

トランザクションの前にREGIONS表を確認してください:

SELECT * FROM REGIONS
ORDER BY REGION_ID;

結果:

 REGION_ID REGION_NAME
---------- -------------------------
         1 Europe
         2 Americas
         3 Asia
         4 Middle East and Africa
         5 Africa

5 rows selected.

トランザクションを開始する前に、リージョン4の国を確認します。

SELECT COUNTRY_NAME, COUNTRY_ID, REGION_ID
FROM COUNTRIES
WHERE REGION_ID = 4
ORDER BY COUNTRY_NAME;

結果:

COUNTRY_NAME                             CO  REGION_ID
---------------------------------------- -- ----------
Egypt                                    EG          4
Israel                                   IL          4
Kuwait                                   KW          4
Nigeria                                  NG          4
Zambia                                   ZM          4
Zimbabwe                                 ZW          4

6 rows selected.

トランザクションを開始する前に、リージョン5の国を確認します。

SELECT COUNTRY_NAME, COUNTRY_ID, REGION_ID
FROM COUNTRIES
WHERE REGION_ID = 5
ORDER BY COUNTRY_NAME;

結果:

no rows selected

複数のセーブポイントがあるトランザクション

UPDATE REGIONS
SET REGION_NAME = 'Middle East'
WHERE REGION_NAME = 'Middle East and Africa';

UPDATE COUNTRIES
  SET REGION_ID = 5
  WHERE COUNTRY_ID = 'ZM';
SAVEPOINT zambia;

UPDATE COUNTRIES
  SET REGION_ID = 5
  WHERE COUNTRY_ID = 'NG';
SAVEPOINT nigeria;

UPDATE COUNTRIES
  SET REGION_ID = 5
  WHERE COUNTRY_ID = 'ZW';
SAVEPOINT zimbabwe;

UPDATE COUNTRIES
  SET REGION_ID = 5
  WHERE COUNTRY_ID = 'EG';
SAVEPOINT egypt;

トランザクション後にREGIONS表を確認します。

SELECT * FROM REGIONS
ORDER BY REGION_ID;

結果:

 REGION_ID REGION_NAME
---------- -------------------------
         1 Europe
         2 Americas
         3 Asia
         4 Middle East
         5 Africa

5 rows selected.

トランザクションが終了してから、リージョン4の国を確認します。

SELECT COUNTRY_NAME, COUNTRY_ID, REGION_ID
FROM COUNTRIES
WHERE REGION_ID = 4
ORDER BY COUNTRY_NAME;

結果:

COUNTRY_NAME                             CO  REGION_ID
---------------------------------------- -- ----------
Israel                                   IL          4
Kuwait                                   KW          4

2 rows selected.

トランザクションが終了してから、リージョン5の国を確認します。

SELECT COUNTRY_NAME, COUNTRY_ID, REGION_ID
FROM COUNTRIES
WHERE REGION_ID = 5
ORDER BY COUNTRY_NAME;

結果:

COUNTRY_NAME                             CO  REGION_ID
---------------------------------------- -- ----------
Egypt                                    EG          5
Nigeria                                  NG          5
Zambia                                   ZM          5
Zimbabwe                                 ZW          5

4 rows selected.

ROLLBACK TO SAVEPOINT nigeria;

ロールバック後にREGIONS表を確認します。

SELECT * FROM REGIONS
ORDER BY REGION_ID;

結果:

 REGION_ID REGION_NAME
---------- -------------------------
         1 Europe
         2 Americas
         3 Asia
         4 Middle East
         5 Africa

5 rows selected.

ロールバックの後に、リージョン4の国を確認します。

SELECT COUNTRY_NAME, COUNTRY_ID, REGION_ID
FROM COUNTRIES
WHERE REGION_ID = 4
ORDER BY COUNTRY_NAME;

結果:

COUNTRY_NAME                             CO  REGION_ID
---------------------------------------- -- ----------
Egypt                                    EG          4
Israel                                   IL          4
Kuwait                                   KW          4
Zimbabwe                                 ZW          4

4 rows selected.

ロールバックの後に、リージョン5の国を確認します。

SELECT COUNTRY_NAME, COUNTRY_ID, REGION_ID
FROM COUNTRIES
WHERE REGION_ID = 5
ORDER BY COUNTRY_NAME;

結果:

COUNTRY_NAME                             CO  REGION_ID
---------------------------------------- -- ----------
Nigeria                                  NG          5
Zambia                                   ZM          5

2 rows selected.

関連項目: SAVEPOINT文の詳細は、Oracle AI Database SQL言語リファレンスを参照してください。