DML文とトランザクションについて
データ操作言語(DML)文は、データベース表のデータを追加、変更および削除します。トランザクションとは、Oracle AI Databaseが1つの単位として扱う1つ以上のSQL文で、すべての文が実行される場合と実行される場合です。
トランザクション制御文について
トランザクションとは、Oracle AI Databaseが1つの単位として扱う1つ以上のSQL文で、すべての文が実行される場合と実行される場合です。複数の操作を1つの単位として実行する必要があるため、ビジネス・プロセスのモデル化にはトランザクションが必要です。
たとえば、マネージャが退職する場合、表にJOB_HISTORY表に行を挿入してマネージャが退職すると表示し、そのマネージャにレポートする全従業員はEMPLOYEES表内でMANAGER_IDの値を更新する必要があります。アプリケーションでこのプロセスをモデル化するには、INSERT文およびUPDATE文を1つのトランザクションにグループ化する必要があります。
基本的なトランザクション制御文には次のものがあります。
-
SAVEPOINT: トランザクションにセーブポイントをマークします。このポイントからトランザクションをロールバックできます。セーブポイントはオプションで、1つのトランザクションで複数のセーブポイントを設定できます。
-
COMMITは、現在のトランザクションを終了し、その変更を確定し、セーブポイントを消去して、そのロックを解除します。
-
現在のトランザクション全体、または指定したセーブポイントの後に実行した変更までをロールバック(取り消し)するROLLBACK。
SQL*Plus環境では、SQL>プロンプトでトランザクション制御文を入力できます。
SQL Developer環境では、ワークシートにトランザクション制御文を入力できます。SQL Developerには、「変更のコミット」および「変更のロールバック」アイコンもあります。詳細は、「トランザクションのコミット」および「トランザクションのロールバック」を参照してください。
注意:
明示的にトランザクションをコミットせずプログラムが異常終了した場合、データベースはコミットされていないトランザクションを自動的にロールバックします。
トランザクションは、アプリケーション・プログラムでコミットするかロールバックして明示的に終了することをお薦めします。
関連情報:
-
トランザクション管理の詳細は『Oracle AI Database概要』を参照してください。
-
トランザクション制御文の詳細は、『Oracle AI Database SQL言語リファレンス』を参照してください。
トランザクションのコミット
トランザクションをコミットすると、そのトランザクションの変更を確定して、セーブポイントを消去しロックを解除します。
トランザクションを明示的にコミットするには、COMMIT文または(SQL Developer環境で)「変更のコミット」アイコンを使用します。
ノート: Oracle AI Databaseは、データ定義言語(DDL)文の前後に暗黙的なCOMMIT文を発行します。DDL文の詳細は、「データ定義言語(DDL)文」を参照してください。
コミット前のトランザクションは次のようになります。
-
変更は表示できますが、他のデータベース・インスタンスのユーザーには表示されません。
-
変更は終了していません。ROLLBACK文を使用して取り消すことができます。
コミット後のトランザクションは、次のようになります。
-
変更は他のユーザーにも確認でき、トランザクションのコミット後に実行した文も確認できます。
-
変更は終了しています。ROLLBACK文を使用しても元に戻すことができません。
例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言語リファレンスを参照してください。