SQLiteトランザクション
トランザクションは、データベース上で実行される作業単位です。トランザクションは、論理的な順序で完了する作業の単位またはシーケンスであり、ユーザーによって手動で完了することも、データベース プログラムによって自動的に完了することもできます。
トランザクションは、データベースを変更する 1 つ以上の拡張機能を指します。たとえば、テーブルからレコードを作成したり、レコードを更新したり、レコードを削除したりしている場合、そのテーブルに対してトランザクションを実行していることになります。データの整合性を確保し、データベース エラーを処理するには、トランザクションを制御することが重要です。
実際、多くの SQLite クエリを 1 つのグループに結合し、トランザクションの一部としてまとめて実行できます。
トランザクションのプロパティ
トランザクションには次の 4 つの標準プロパティがあり、頭字語に基づいて ACID と呼ばれることがよくあります:
原子性: 作業単位内のすべての操作が正常に完了することを保証します。そうでない場合、トランザクションは次の日に終了します。失敗すると、以前の操作は以前の状態にロールバックされます。
一貫性: 正常にコミットされたトランザクションでデータベースの状態が正しく変更されることを確認します。
分離: トランザクション操作を独立かつ透過的にします。
耐久性 (耐久性): システム障害が発生した場合でも、コミットされたトランザクションの結果または影響がまだ存在することを確認します。
トランザクション制御
次のコマンドを使用してトランザクションを制御します:
BEGIN TRANSACTION: トランザクション処理を開始します。
COMMIT: 変更を保存するか、END TRANSACTION コマンドを使用できます。
ROLLBACK: 変更をロールバックします。
トランザクション制御コマンドは、DML コマンド INSERT、UPDATE、および DELETE でのみ使用されます。テーブルの作成またはテーブルの削除時には、これらの操作は自動的にデータベースにコミットされるため、これらの操作は使用できません。
BEGIN TRANSACTION コマンド
トランザクション (トランザクション) は、BEGIN TRANSACTION コマンドまたは単純な BEGIN コマンドを使用して開始できます。このようなトランザクションは通常、次の COMMIT または ROLLBACK コマンドが発生するまで継続します。ただし、データベースが閉じられた場合やエラーが発生した場合にも、トランザクションはロールバックされます。以下はトランザクションを開始するための簡単な構文です:
BEGIN; or BEGIN TRANSACTION;
COMMIT コマンド
COMMIT コマンドは、トランザクションによって呼び出された変更をデータベースに保存するために使用されるトランザクション コマンドです。
COMMIT コマンドは、最後の COMMIT または ROLLBACK コマンド以降のすべてのトランザクションをデータベースに保存します。
COMMIT コマンドの構文は次のとおりです。
COMMIT; or END TRANSACTION;
ROLLBACK コマンド
ROLLBACK コマンドは、データベースに保存されていないトランザクションを元に戻すために使用されるトランザクション コマンドです。
ROLLBACK コマンドは、最後に COMMIT または ROLLBACK コマンドが発行されて以降のトランザクションを元に戻すためにのみ使用できます。
ROLLBACK コマンドの構文は次のとおりです:
ROLLBACK;
例
COMPANY テーブルに次のレコードがあるとします。
ID NAME AGE ADDRESS SALARY ---------- ---------- ---------- ---------- ---------- 1 Paul 32 California 20000.0 2 Allen 25 Texas 15000.0 3 Teddy 23 Norway 20000.0 4 Mark 25 Rich-Mond 65000.0 5 David 27 Texas 85000.0 6 Kim 22 South-Hall 45000.0 7 James 24 Houston 10000.0
次に、トランザクションを開始してテーブルから age = 25 のレコードを削除しましょう。では、ROLLBACK コマンドを使用してすべての変更を元に戻します。
sqlite> BEGIN; sqlite> DELETE FROM COMPANY WHERE AGE = 25; sqlite> ROLLBACK;
COMPANY テーブルを確認してください。まだ次のレコードがあります:
ID NAME AGE ADDRESS SALARY ---------- ---------- ---------- ---------- ---------- 1 Paul 32 California 20000.0 2 Allen 25 Texas 15000.0 3 Teddy 23 Norway 20000.0 4 Mark 25 Rich-Mond 65000.0 5 David 27 Texas 85000.0 6 Kim 22 South-Hall 45000.0 7 James 24 Houston 10000.0
次に、別のトランザクションを開始して、テーブルから age = 25 のレコードを削除して、最後に COMMIT コマンドを使用してすべての変更をコミットします。
sqlite> BEGIN; sqlite> DELETE FROM COMPANY WHERE AGE = 25; sqlite> COMMIT;
COMPANY テーブルを確認すると、次のレコードがあります:
ID NAME AGE ADDRESS SALARY ---------- ---------- ---------- ---------- ---------- 1 Paul 32 California 20000.0 3 Teddy 23 Norway 20000.0 5 David 27 Texas 85000.0 6 Kim 22 South-Hall 45000.0 7 James 24 Houston 10000.0