SQL-トランザクション

トランザクションは、データベースに対して実行される作業単位です。トランザクションは、ユーザーが手動で行う場合でも、ある種のデータベースプログラムによって自動的に行う場合でも、論理的な順序で実行される作業の単位またはシーケンスです。

トランザクションとは、データベースへの1つ以上の変更の伝播です。たとえば、レコードを作成したり、レコードを更新したり、テーブルからレコードを削除したりする場合は、そのテーブルでトランザクションを実行しています。これらのトランザクションを制御して、データの整合性を確保し、データベースエラーを処理することが重要です。

実際には、多くのSQLクエリをグループにまとめ、トランザクションの一部としてそれらすべてを一緒に実行します。

トランザクションのプロパティ

トランザクションには次の4つの標準プロパティがあり、通常は頭字語で呼ばれます。 ACID

  • Atomicity−ワークユニット内のすべての操作が正常に完了するようにします。それ以外の場合、トランザクションは失敗した時点で中止され、以前のすべての操作は以前の状態にロールバックされます。

  • Consistency −トランザクションが正常にコミットされると、データベースの状態が適切に変更されるようにします。

  • Isolation −トランザクションが互いに独立して透過的に動作できるようにします。

  • Durability −システム障害が発生した場合でも、コミットされたトランザクションの結果または効果が持続することを保証します。

トランザクション制御

次のコマンドは、トランザクションを制御するために使用されます。

  • COMMIT −変更を保存します。

  • ROLLBACK −変更をロールバックします。

  • SAVEPOINT −ロールバックするトランザクションのグループ内にポイントを作成します。

  • SET TRANSACTION −トランザクションに名前を付けます。

トランザクション制御コマンド

トランザクション制御コマンドは、 DML Commands例-INSERT、UPDATE、DELETEのみ。これらの操作はデータベースで自動的にコミットされるため、テーブルの作成中または削除中には使用できません。

COMMITコマンド

COMMITコマンドは、トランザクションによって呼び出された変更をデータベースに保存するために使用されるトランザクションコマンドです。

COMMITコマンドは、トランザクションによって呼び出された変更をデータベースに保存するために使用されるトランザクションコマンドです。COMMITコマンドは、最後のCOMMITまたはROLLBACKコマンド以降のすべてのトランザクションをデータベースに保存します。

COMMITコマンドの構文は次のとおりです。

COMMIT;

Example

次のレコードを持つCUSTOMERSテーブルについて考えてみます-

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 |
|  2 | Khilan   |  25 | Delhi     |  1500.00 |
|  3 | kaushik  |  23 | Kota      |  2000.00 |
|  4 | Chaitali |  25 | Mumbai    |  6500.00 |
|  5 | Hardik   |  27 | Bhopal    |  8500.00 |
|  6 | Komal    |  22 | MP        |  4500.00 |
|  7 | Muffy    |  24 | Indore    | 10000.00 |
+----+----------+-----+-----------+----------+

以下は、age = 25のレコードをテーブルから削除してから、データベース内の変更をコミットする例です。

SQL> DELETE FROM CUSTOMERS
   WHERE AGE = 25;
SQL> COMMIT;

したがって、テーブルから2つの行が削除され、SELECTステートメントは次の結果を生成します。

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 |
|  3 | kaushik  |  23 | Kota      |  2000.00 |
|  5 | Hardik   |  27 | Bhopal    |  8500.00 |
|  6 | Komal    |  22 | MP        |  4500.00 |
|  7 | Muffy    |  24 | Indore    | 10000.00 |
+----+----------+-----+-----------+----------+

ROLLBACKコマンド

ROLLBACKコマンドは、データベースにまだ保存されていないトランザクションを元に戻すために使用されるトランザクションコマンドです。このコマンドは、最後のCOMMITまたはROLLBACKコマンドが発行されてからのトランザクションを元に戻すためにのみ使用できます。

ROLLBACKコマンドの構文は次のとおりです-

ROLLBACK;

Example

次のレコードを持つCUSTOMERSテーブルについて考えてみます-

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 |
|  2 | Khilan   |  25 | Delhi     |  1500.00 |
|  3 | kaushik  |  23 | Kota      |  2000.00 |
|  4 | Chaitali |  25 | Mumbai    |  6500.00 |
|  5 | Hardik   |  27 | Bhopal    |  8500.00 |
|  6 | Komal    |  22 | MP        |  4500.00 |
|  7 | Muffy    |  24 | Indore    | 10000.00 |
+----+----------+-----+-----------+----------+

以下は、年齢= 25のレコードをテーブルから削除してから、データベース内の変更をロールバックする例です。

SQL> DELETE FROM CUSTOMERS
   WHERE AGE = 25;
SQL> ROLLBACK;

したがって、削除操作はテーブルに影響を与えず、SELECTステートメントは次の結果を生成します。

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 |
|  2 | Khilan   |  25 | Delhi     |  1500.00 |
|  3 | kaushik  |  23 | Kota      |  2000.00 |
|  4 | Chaitali |  25 | Mumbai    |  6500.00 |
|  5 | Hardik   |  27 | Bhopal    |  8500.00 |
|  6 | Komal    |  22 | MP        |  4500.00 |
|  7 | Muffy    |  24 | Indore    | 10000.00 |
+----+----------+-----+-----------+----------+

SAVEPOINTコマンド

SAVEPOINTは、トランザクション全体をロールバックせずにトランザクションを特定のポイントにロールバックできるトランザクション内のポイントです。

SAVEPOINTコマンドの構文は次のとおりです。

SAVEPOINT SAVEPOINT_NAME;

このコマンドは、すべてのトランザクションステートメントの中でSAVEPOINTを作成する場合にのみ機能します。ROLLBACKコマンドは、トランザクションのグループを元に戻すために使用されます。

SAVEPOINTにロールバックするための構文は次のとおりです。

ROLLBACK TO SAVEPOINT_NAME;

以下は、CUSTOMERSテーブルから3つの異なるレコードを削除することを計画している例です。削除するたびにSAVEPOINTを作成して、いつでも任意のSAVEPOINTにロールバックして、適切なデータを元の状態に戻すことができるようにします。

Example

次のレコードを持つCUSTOMERSテーブルについて考えてみます。

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 |
|  2 | Khilan   |  25 | Delhi     |  1500.00 |
|  3 | kaushik  |  23 | Kota      |  2000.00 |
|  4 | Chaitali |  25 | Mumbai    |  6500.00 |
|  5 | Hardik   |  27 | Bhopal    |  8500.00 |
|  6 | Komal    |  22 | MP        |  4500.00 |
|  7 | Muffy    |  24 | Indore    | 10000.00 |
+----+----------+-----+-----------+----------+

次のコードブロックには、一連の操作が含まれています。

SQL> SAVEPOINT SP1;
Savepoint created.
SQL> DELETE FROM CUSTOMERS WHERE ID=1;
1 row deleted.
SQL> SAVEPOINT SP2;
Savepoint created.
SQL> DELETE FROM CUSTOMERS WHERE ID=2;
1 row deleted.
SQL> SAVEPOINT SP3;
Savepoint created.
SQL> DELETE FROM CUSTOMERS WHERE ID=3;
1 row deleted.

3つの削除が行われたので、気が変わって、SP2として識別したSAVEPOINTにロールバックすることにしたと仮定します。SP2は最初の削除後に作成されたため、最後の2つの削除は取り消されます-

SQL> ROLLBACK TO SP2;
Rollback complete.

SP2にロールバックしてから、最初の削除のみが行われたことに注意してください。

SQL> SELECT * FROM CUSTOMERS;
+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  2 | Khilan   |  25 | Delhi     |  1500.00 |
|  3 | kaushik  |  23 | Kota      |  2000.00 |
|  4 | Chaitali |  25 | Mumbai    |  6500.00 |
|  5 | Hardik   |  27 | Bhopal    |  8500.00 |
|  6 | Komal    |  22 | MP        |  4500.00 |
|  7 | Muffy    |  24 | Indore    | 10000.00 |
+----+----------+-----+-----------+----------+
6 rows selected.

RELEASESAVEPOINTコマンド

RELEASE SAVEPOINTコマンドは、作成したSAVEPOINTを削除するために使用されます。

RELEASESAVEPOINTコマンドの構文は次のとおりです。

RELEASE SAVEPOINT SAVEPOINT_NAME;

SAVEPOINTが解放されると、最後のSAVEPOINT以降に実行されたトランザクションを元に戻すためにROLLBACKコマンドを使用できなくなります。

SETTRANSACTIONコマンド

SET TRANSACTIONコマンドを使用して、データベーストランザクションを開始できます。このコマンドは、後続のトランザクションの特性を指定するために使用されます。たとえば、トランザクションを読み取り専用または読み取り/書き込みに指定できます。

SETTRANSACTIONコマンドの構文は次のとおりです。

SET TRANSACTION [ READ WRITE | READ ONLY ];