目次
このレッスンでは、トランザクション処理とは何か、および COMMIT ステートメントと ROLLBACK ステートメントを使用してトランザクション処理を管理する方法について説明します。
前に書いた
トランザクションは非常に重要な概念です. 作業のほとんどどこにでも見られます. トランザクションはデータの一貫性を維持する上で重要な役割を果たします. トランザクションについて非常に深く理解し, それらを適用する方法を学ぶ必要があります. これはあなたに大きな利益をもたらします. そうしないと、トランザクションではないために発生するさまざまな問題によって、実際の痛みが何であるかがわかります. 少し大きな会社では、数百または数千のテーブルが非常に一般的です.
20.1 トランザクション処理
トランザクション処理を使用して、SQL 操作のバッチが完全に実行されるか、まったく実行されないようにすることで、データベースの整合性を維持します。
レッスン 12 で説明したように、リレーショナル データベースはデータを複数のテーブルに格納するため、データの操作、保守、および再利用が容易になります。リレーショナル データベース設計の方法と理由については説明しませんが、適切に設計されたデータベース スキーマは、ある程度リレーショナルです。
多くのテーブルに対して挿入/削除/更新操作を順次実行する必要があり、何らかのデータベース障害 (ディスク容量の超過、セキュリティ制限、テーブル ロックなど) が原因で、このプロセスを完了できないとします。データベース内のデータはどうなりますか?
一部のステートメントは正常に実行されるようになりますが、次のステートメントは途中の文のエラーのために正常に実行されないため、データをどのように操作するかが大きな問題であり、どこで問題が発生したのかさえわかりません。 .
この問題を解決するには?これには、トランザクション処理を使用する必要があります。トランザクション処理は、データベースに不完全な操作結果が含まれないようにするためにバッチで実行する必要がある SQL 操作を管理するためのメカニズムです。トランザクションを使用すると、一連の操作が途中で停止せず、完全に実行されるか、まったく実行されないことを保証できます (明示的に指示されない限り)。エラーが発生しない場合は、一連のステートメント全体がデータベース テーブルにコミット (書き込み) されます。エラーが発生した場合は、ロールバック (元に戻す) が実行され、データベースが既知の安全な状態に復元されます。
トランザクションを操作する際に繰り返し使用されるキーワードがいくつかあります。トランザクション処理について知っておく必要があるいくつかの用語を次に示します。
- トランザクションは一連の SQL ステートメントを参照します。
- ロールバックとは、指定された SQL ステートメントを元に戻すプロセスを指します。
- コミット (commit) は、保存されていない SQL ステートメントの結果をデータベース テーブルに書き込むことを指します。
- セーブポイントは、 (トランザクション全体をロールバックするのではなく) ロールバックを発行できるトランザクションに設定された一時的なプレースホルダーです。
ロールバックできるステートメントはどれですか?
トランザクション処理は、INSERT、UPDATE、および DELETE ステートメントの管理に使用されます。SELECT ステートメントをロールバックすることはできません (SELECT ステートメントをロールバックする必要はありません)。また、CREATE または DROP 操作をロールバックすることもできません。これらのステートメントはトランザクション処理で使用できますが、これらの操作はロールバックの実行時に元に戻すことはできません。
20.2 制御トランザクション
トランザクションを管理するための鍵は、SQL ステートメントのグループを論理チャンクに分割し、データをロールバックする必要がある場合とロールバックしない場合を指定することです。
Oracle で使用される構文:
SET TRANSACTION
...
Oracle は、この種の操作を使用してトランザクションを実装することもできます。
begin
语句一;
语句二;
......
语句三;
end;
ほとんどの実装では、トランザクションがどこで終了するかを明示的に識別していません。トランザクションは、中断されるまで存在します。通常、COMMITT は変更を保存するために使用され、ROLLBACK は元に戻すために使用されます。詳しくは、以下で説明します。
20.2.1 ROLLBACKの使用
ROLLBACK コマンドは、SQL ステートメントをロールバック (取り消し) するために使用されます。
DELETE FROM Orders;
ROLLBACK;
この例では、DELETE 操作が実行され、ROLLBACK ステートメントで元に戻されます。
20.2.2 COMMITの使用
一般的な SQL ステートメントが実行され、データベース テーブルに対して直接書き込まれます。これは、いわゆる暗黙のコミット (暗黙のコミット)、つまり、コミット (書き込みまたは保存) 操作が自動です。
トランザクション ブロック内では、コミットは暗黙的に行われません。ただし、異なる DBMS では異なる方法で実行されます。トランザクションの終了を暗黙的にコミットされたものとして扱う DBMS もあれば、そうでないものもあります。
明示的なコミットを行うには、COMMIT ステートメントを使用します。
SET TRANSACTION
DELETE OrderItems WHERE order_num = 12345;
DELETE Orders WHERE order_num = 12345;
COMMIT;
20.2.3 予約ポイントの利用
単純な ROLLBACK および COMMIT ステートメントを使用して、トランザクション全体を書き込んだり元に戻したりできます。ただし、これは単純なトランザクションでのみ可能であり、複雑なトランザクションでは部分的なコミットまたはロールバックが必要になる場合があります。
部分的なトランザクションのロールバックをサポートするには、トランザクション ブロック内の適切な場所にプレースホルダーを配置する必要があります。そうすれば、フォールバックする必要がある場合は、プレースホルダーにフォールバックできます。
SQL では、これらのプレースホルダーは保持ポイントと呼ばれます。MariaDB、MySQL、および Oracle でプレースホルダーを作成するには、SAVEPOINT ステートメントを使用します。
SAVEPOINT delete1;
実際、仕事で使われることはあまりありませんが、これは仕事の性質によるものかもしれません。
ポイントは貯めれば貯めるほどお得
SQL コードに必要な数のホールドポイントを設定できますが、多いほど良いです。なぜ?保持するポイントが多いほど、より柔軟にフォールバックできるからです。
保持ポイントを使用する利点:
大量の SQL のバッチを実行しているときに、後でエラーが発生すると SQL の実行が失敗し、リテンション ポイントがない場合は、最初から実行する必要があり、時間がかかります。ただし、予約点がある場合は、実行するSQL文の数を減らすことができ、時間を短縮できます。