pl sql transactions commit
COMMIT、ROLLBACK、およびSAVEPOINTSステートメントの例を使用してPLSQLトランザクションについて学習します。
この記事では、 PL / SQLシリーズ 。の中に PLSQLパッケージ チュートリアルでは、パッケージ、その利点、仕様、および構造について学習しました。
ここでは、PLSQLトランザクションとその特性について説明します。 PL SQLトランザクションに関連する、COMMIT、ROLLBACK、SAVEPOINTSなどのいくつかのPL / SQLステートメントについて説明します。
PLSQLのLOCKTABLeおよびAUTOCOMMITステートメントについても学習します。
議論から始めましょう!
学習内容:
PLSQLトランザクション
複数のSQLステートメントを持つデータベース内の作業のアトミックコンポーネントは、トランザクションと呼ばれます。 SQLステートメントの影響を受ける変更があると、コミット(データベースへの無期限の更新)またはロールバック(データベースへの更新の取り消し)のいずれかが可能になるため、アトミックと呼ばれます。
SQLステートメントはコミットする必要があります。そうしないと、ロールバックでき、SQLステートメントが実行するはずだったすべての変更が取り消されたままになります。 PL / SQLプログラムがトランザクションの途中で停止した場合、データベースへの影響はなく、元の状態に復元されます。
COMMITとROLLBACKは、データベースへの変更が永続的であるか、元に戻されるという事実を処理します。 SAVEPOINTステートメントは、トランザクション処理の現在の位置を指します。
トランザクション処理を開始します
すべてのトランザクションには開始と終了があります。
次のインシデントは、トランザクションの開始を示します。
- データベースへの接続後、最初のSQLステートメントが実行されます。
- 前のSQLステートメントが完了した後、新しいSQLステートメントが実行されます。
トランザクション処理の終了
各PL / SQLプログラムには、COMMITまたはROLLBACK文が必要です。トランザクションの後にCOMMITとROLLBACKのどちらを使用するかは、プログラミングロジックにのみ依存します。
不和のための最高の無料ボイスチェンジャー
COMMITまたはROLLBACKステートメントが使用されない場合、データベースの最終状態がどのようになるかはホスト環境によって異なります。 例えば、 SQL * PLUS環境では、PL / SQLコード・ブロックにCOMMITまたはROLLBACKステートメントがない場合、データベースの状態は、その直後に実行されるコード・ブロックに依存します。
Oracle環境では、データ定義またはデータ制御クエリの実行後にCOMMITステートメントを含めるか、DISCONNECT、EXIT、またはQUITコマンドを実行すると、トランザクションがコミットされます。また、ROLLBACKステートメントを含めると、トランザクションは取り消されます。
したがって、以下のシナリオが原因でトランザクションが終了する可能性があります。
- ROLLBACKまたはCOMMITステートメントが実行されます。
- DDLクエリ( 例えば、 テーブル作成ステートメント)が実行され、その後、デフォルトでCOMMITが実行されます。
- DCLクエリ( 例えば、 GRANTステートメント)が実行され、その後、デフォルトでCOMMITが実行されます。
- ユーザーがデータベース接続を終了します。
- ユーザーはEXITステートメントを実行してSQL * PLUSから出力し、その後、デフォルトでCOMMITが実行されます。
- SQL * PLUSで異常終了が発生した後、デフォルトでROLLBACKが実行されます。
- DMLクエリは正常に実行されません。その後、デフォルトでROLLBACKが実行され、データベースが元の状態に戻ります。
恒久的な変更のためのコミット
COMMITステートメントは、現在のトランザクションを終了し、トランザクションによって実行される永続的な変更を行うことができます。 COMMITが実行されると、変更されたデータを取得できます。
COMMITステートメントが実行されると、影響を受けるテーブルのすべての行がロックから解放されます。また、SAVEPOINTを取り除くのにも役立ちます。 COMMITステートメントには、オプションでWORKステートメント(COMMIT WORK)を付けることができます。これは、コードの可読性を向上させるためにのみ追加されます。
COMMIT時にトランザクションが失敗し、トランザクションの状態が不明な場合、その時点で、PL / SQLコードのCOMMENTテキストがトランザクションのIDとともにデータディクショナリに格納されます。
トランザクションCOMMITの構文:
COMMIT;
TEACHERSという名前のテーブルについて考えてみましょう。
以下に示すSQLステートメントを使用してTEACHERSテーブルを作成しました。
CREATE TABLE TEACHERS ( CODE INT NOT NULL, SUBJECT VARCHAR (15) NOT NULL, NAME VARCHAR (15) NOT NULL, PRIMARY KEY (CODE) );
このテーブルに値を挿入してから、次の方法でトランザクションをコミットします。
INSERT INTO TEACHERS VALUES (1, 'SELENIUM', 'TOM'); INSERT INTO TEACHERS VALUES (2, 'UFT', 'SAM'); INSERT INTO TEACHERS VALUES (3, 'JMETERE', 'TONK'); COMMIT;
次に、以下のクエリが実行されます。
SELECT * FROM TEACHERS;
出力:
変更を元に戻すためのロールバック
現在のトランザクションがROLLBACKステートメントで終了した場合、トランザクションで行われるはずのすべての変更が取り消されます。
ROLLBACKステートメントには、以下にリストされている次の機能があります。
- テーブルから重要な行を誤って削除した場合に備えて、データベースはROLLBACKステートメントを使用して元の状態に復元されます。
- SQLステートメントの実行失敗につながる例外が発生した場合、ROLLBACKステートメントを使用すると、プログラムの開始点にジャンプして、そこから是正措置を講じることができます。
- COMMITステートメントなしでデータベースに加えられた更新は、ROLLBACKステートメントで取り消すことができます。
トランザクションROLLBACKの構文:
ROLLBACK;
SAVEPOINTを使用したトランザクションROLLBACKの構文:
ROLLBACK (TO SAVEPOINT );
ここでは、 save_n SAVEPOINTの名前です。
以前に作成したTEACHERSテーブルについて考えてみましょう。
ROLLBACKを使用したコード実装:
DELETE FROM TEACHERS WHERE CODE= 3; ROLLBACK;
次に、以下のクエリが実行されます。
SELECT * FROM TEACHERS;
上記のコードの出力は次のようになります。
上記のコードでは、CODEが3の教師のレコードを削除することになっているDELETEステートメントを実行しました。ただし、ROLLBACKステートメントのため、データベースへの影響はなく、削除は行われません。
部分的な変更を元に戻すためのSAVEPOINT
SAVEPOINTは、現在のトランザクション処理ポイントに名前とIDを付けます。これは通常、ROLLBACKステートメントに関連付けられています。これにより、トランザクション全体に触れないことで、トランザクションの一部のセクションを元に戻すことができます。
SAVEPOINTにROLLBACKを適用すると、その特定のSAVEPOINTの後に含まれるすべてのSAVEPOINTが削除されます(つまり、3つのSAVEPOINTをマークし、2番目のSAVEPOINTにROLLBACKを適用すると、3番目のSAVEPOINTが自動的に削除されます)。
クイックブックを無料で入手する方法
COMMITまたはROLLBACKステートメントは、すべてのSAVEPOINTSを削除します。 SAVEPOINTに付けられた名前は宣言されていない識別子であり、トランザクション内で数回再適用できます。トランザクション内で、SAVEPOINTが古い位置から現在の位置に移動します。
SAVEPOINTに適用されたロールバックは、トランザクションの進行中の部分にのみ影響します。したがって、SAVEPOINTは、検証ポイントを配置することにより、長いトランザクションを小さなセクションに分割するのに役立ちます。
トランザクションSAVEPOINTの構文:
SAVEPOINT ;
ここに、 save_n SAVEPOINTの名前です。
以前に作成したTEACHERSテーブルについてもう一度考えてみましょう。
ROLLBACK WITH SAVEPOINTのコード実装:
INSERT INTO TEACHERS VALUES (4, 'CYPRESS', 'MICHEAL'); SAVEPOINT s; INSERT INTO TEACHERS VALUES (5, 'PYTHON', 'STEVE'); INSERT INTO TEACHERS VALUES (6, 'PYTEST', 'ARNOLD'); ROLLBACK TO s; INSERT INTO TEACHERS VALUES (7, 'PROTRACTOR', 'FANNY'); COMMIT;
次に、以下のクエリが実行されます。
SELECT * FROM TEACHERS;
上記のコードの出力は次のようになります。
上記のコードでは、SAVEPOINTを使用したROLLBACKの後 s が適用されると、さらに2行だけが挿入されます。つまり、それぞれCODE4と7の教師です。テーブルの作成中に、コード1、2、および3の教師が追加されていることに注意してください。
PL / SQLのLOCK表
PL / SQLのLOCK文は、ロック・モードでデータベース全体をロックできるようにします。これにより、テーブルへのアクセスを共有するか禁止するかが決まります。
ロックテーブルの例を見てみましょう。
LOCK TABLE teachers IN ROW SHARE MODE NOWAIT;
上記のクエリは、TEACHERSテーブルを行共有モードでロックします。行共有モードは、テーブルの同時使用を許可します。ユーザーが個別に使用するためにテーブル全体をロックすることはできません。 COMMITまたはROLLBACKの実行後、テーブルロックは解放されます。 NOWAITキーワードは、データベースがロックが解放されるのを待つことを許可されていないことを示すために使用されます。
ロックモードは、他にどのようなロックをテーブルに適用できるかを結論付けるために重要です。
PL / SQLで使用可能ないくつかのLOCKモードについて説明します。
Sl。番号 | ロックモード | 目的 |
---|---|---|
1 | 行共有 | これにより、複数のユーザーがテーブルを同時に使用できます。ただし、ユーザーは排他的な使用のためにテーブル全体をロックすることはできません。 |
二 | 行限定 | これにより、複数のユーザーがテーブルを同時に使用できます。ただし、ユーザーは、共有モードで排他的に使用するためにテーブル全体をロックすることはできません。 |
3 | 更新を共有する | これにより、複数のユーザーがテーブルを同時に使用できます。ただし、ユーザーは排他的な使用のためにテーブル全体をロックすることはできません。 |
4 | 共有 | これにより、テーブルに対して複数のクエリを同時に実行できます。ただし、ユーザーはロックされたテーブルを変更することはできません。 |
5 | 排他的な共有行 | これにより、テーブルへの読み取り専用アクセス権を持つユーザーが許可されます。テーブルを変更したり、共有モードでテーブルをロックしたりすることはできません。 |
6 | 排他的 | ロックされたテーブルに対してのみクエリを実行できます。 |
PL / SQLでの自動トランザクション制御
INSERTまたはDELETEステートメントが実行されるたびにCOMMITステートメントがデフォルトで実行されるように構成を行うことができます。これは、AUTOCOMMIT環境変数をONにすることによって行われます。
構文:
SET AUTOCOMMIT ON;
繰り返しますが、これはAUTOCOMMIT環境変数をOFFにすることでオフにできます。
構文:
SET AUTOCOMMIT OFF;
よくある質問と回答
Q#1)PL SQLのトランザクションは何ですか?
回答: トランザクションは、アトミックユニットとして機能するSQLデータ計算ステートメントのグループです。すべてのトランザクションは本質的にアトミックであり、コミットまたはロールバックされます。
Q#2)PL SQLのCOMMITとは何ですか?
回答: COMMITステートメントは、現在のトランザクションによってデータベースに永続的な変更を加えるために使用されます。これにより、データベースへの変更がユーザーに表示されます。
Q#3)トランザクションをどのように終了しますか?
回答: トランザクションは、COMMITまたはROLLBACKステートメントで明示的に終了します。 DMLステートメントの実行後に無条件に終了することもできます。
Q#4)トリガーでコミットできますか?
回答: はい、トリガートランザクションが親トランザクションからスタンドアロンである場合にのみ、トリガーでコミットできます。
Q#5)SELECTはトランザクションですか?
回答: はい、SELECTはトランザクションのすべての特性を備えたトランザクションです。
Q#6)Oracleでトランザクションをロールバックするにはどうすればよいですか?
回答: Oracleでトランザクションをロールバックするには、ROLLBACKステートメントを実行する必要があります。データベースへのトランザクションによって行われたすべての変更を元に戻し、元の状態に復元する必要があります。
ウォークラフトプライベートサーバーの新しい世界
結論
このチュートリアルでは、PLSQLトランザクションの管理に不可欠なPLSQLトランザクションのいくつかの基本的な概念について詳しく説明しました。 以下のトピックについて説明しました。
- トランザクション。
- トランザクションでのCOMMITの使用。
- トランザクションのロールバックとは何ですか?
- トランザクションでのSAVEPOINTでのROLLBACKの使用。
- LOCKテーブル。