Plsql-transactions
PL/SQL-トランザクション
この章では、PL/SQLのトランザクションについて説明します。 データベースの*トランザクション*は、1つ以上の関連するSQLステートメントで構成される可能性があるアトミックな作業単位です。 トランザクションを構成するSQLステートメントによってもたらされるデータベースの変更は、一括してコミット、つまりデータベースに永続的にするか、データベースからロールバック(元に戻す)できるため、アトミックと呼ばれます。
正常に実行されたSQLステートメントとコミットされたトランザクションは同じではありません。 SQLステートメントが正常に実行された場合でも、そのステートメントを含むトランザクションがコミットされない限り、それをロールバックし、ステートメントによって行われたすべての変更を元に戻すことができます。
トランザクションの開始と終了
トランザクションには beginning と end があります。 次のイベントのいずれかが発生すると、トランザクションが開始されます-
- 最初のSQLステートメントは、データベースに接続した後に実行されます。
- トランザクションの完了後に発行される新しいSQLステートメントごと。
トランザクションは、次のイベントのいずれかが発生したときに終了します-
- COMMIT または ROLLBACK ステートメントが発行されます。
- CREATE TABLE ステートメントなどの DDL ステートメントが発行されます。その場合、COMMITが自動的に実行されるためです。
- GRANT ステートメントなどの DCL ステートメントが発行されます。その場合、COMMITが自動的に実行されるためです。
- ユーザーがデータベースから切断します。
- ユーザーは EXIT コマンドを発行して SQL PLUS を終了すると、COMMITが自動的に実行されます。 *SQL Plusは異常終了し、 ROLLBACK が自動的に実行されます。
- DML ステートメントは失敗します。その場合、そのDMLステートメントを取り消すためにROLLBACKが自動的に実行されます。
トランザクションをコミットする
トランザクションは、SQLコマンドCOMMITを発行することにより永続的になります。 COMMITコマンドの一般的な構文は次のとおりです-
COMMIT;
例えば、
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (1, 'Ramesh', 32, 'Ahmedabad', 2000.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (2, 'Khilan', 25, 'Delhi', 1500.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (3, 'kaushik', 23, 'Kota', 2000.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (4, 'Chaitali', 25, 'Mumbai', 6500.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (5, 'Hardik', 27, 'Bhopal', 8500.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (6, 'Komal', 22, 'MP', 4500.00 );
COMMIT;
トランザクションのロールバック
COMMITなしでデータベースに加えられた変更は、ROLLBACKコマンドを使用して元に戻すことができます。
ROLLBACKコマンドの一般的な構文は次のとおりです-
ROLLBACK [TO SAVEPOINT < savepoint_name>];
システム障害などの前例のない状況によりトランザクションが中止されると、コミット以降のトランザクション全体が自動的にロールバックされます。 あなたが*セーブポイント*を使用していない場合は、単に次のステートメントを使用して、すべての変更をロールバックします-
ROLLBACK;
セーブポイント
セーブポイントは、いくつかのチェックポイントを設定することにより、長いトランザクションを小さな単位に分割するのに役立つ一種のマーカーです。 長いトランザクション内でセーブポイントを設定することにより、必要に応じてチェックポイントにロールバックできます。 これは、 SAVEPOINT コマンドを発行することにより行われます。
SAVEPOINTコマンドの一般的な構文は次のとおりです-
SAVEPOINT < savepoint_name >;
例えば
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (7, 'Rajnish', 27, 'HP', 9500.00 );
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (8, 'Riddhi', 21, 'WB', 4500.00 );
SAVEPOINT sav1;
UPDATE CUSTOMERS
SET SALARY = SALARY + 1000;
ROLLBACK TO sav1;
UPDATE CUSTOMERS
SET SALARY = SALARY + 1000
WHERE ID = 7;
UPDATE CUSTOMERS
SET SALARY = SALARY + 1000
WHERE ID = 8;
COMMIT;
*ROLLBACK TO sav1* -このステートメントは、セーブポイントsav1をマークしたポイントまでのすべての変更をロールバックします。
その後、新しい変更が開始されます。
自動トランザクション制御
*INSERT、UPDATE* 、または *DELETE* コマンドが実行されるたびに *COMMIT* を自動的に実行するには、 *AUTOCOMMIT* 環境変数を次のように設定できます-
SET AUTOCOMMIT ON;
あなたは、次のコマンドを使用して自動コミットモードをオフにすることができます-
SET AUTOCOMMIT OFF;