Sql-transactions

提供:Dev Guides
移動先:案内検索

SQL-トランザクション

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

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

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

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

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

  • Atomicity -ワークユニット内のすべての操作が正常に完了することを保証します。 それ以外の場合、トランザクションは失敗した時点で中止され、以前の操作はすべて以前の状態にロールバックされます。
  • 一貫性-正常にコミットされたトランザクションでデータベースが状態を適切に変更することを保証します。
  • 分離-トランザクションが相互に独立して透過的に動作できるようにします。
  • 耐久性-システム障害が発生した場合に、コミットされたトランザクションの結果または効果が持続することを保証します。

トランザクション制御

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

  • COMMIT -変更を保存します。
  • ROLLBACK -変更をロールバックします。
  • SAVEPOINT -ROLLBACKするトランザクションのグループ内にポイントを作成します。
  • SET TRANSACTION -トランザクションに名前を付けます。

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

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

COMMITコマンド

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

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

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

COMMIT;

次のレコードを持つ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> 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;

次のレコードを持つ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のレコードをテーブルから削除し、データベースの変更をROLLBACKします。

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_NAME;

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

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

ROLLBACK TO SAVEPOINT_NAME;

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

  • 例 *

次のレコードを持つ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.

RELEASE SAVEPOINTコマンド

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

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

RELEASE SAVEPOINT SAVEPOINT_NAME;

SAVEPOINTがリリースされると、ROLLBACKコマンドを使用して、最後のSAVEPOINT以降に実行されたトランザクションを取り消すことはできなくなります。

SET TRANSACTIONコマンド

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

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

SET TRANSACTION [ READ WRITE | READ ONLY ];