SQLite-トランザクション
トランザクションは、データベースに対して実行される作業単位です。トランザクションは、ユーザーが手動で行う場合でも、ある種のデータベースプログラムによって自動的に行う場合でも、論理的な順序で実行される作業の単位またはシーケンスです。
トランザクションとは、データベースへの1つ以上の変更の伝播です。たとえば、テーブルからレコードを作成、更新、または削除する場合は、テーブルでトランザクションを実行しています。データの整合性を確保し、データベースエラーを処理するには、トランザクションを制御することが重要です。
実際には、多くのSQLiteクエリをグループにまとめ、トランザクションの一部としてそれらすべてを一緒に実行します。
トランザクションのプロパティ
トランザクションには次の4つの標準プロパティがあり、通常は頭字語ACIDと呼ばれます。
Atomicity−ワークユニット内のすべての操作が正常に完了していることを確認します。それ以外の場合、トランザクションは失敗した時点で中止され、以前の操作は以前の状態にロールバックされます。
Consistency −トランザクションが正常にコミットされると、データベースの状態が適切に変更されるようにします。
Isolation −トランザクションが互いに独立して透過的に動作できるようにします。
Durability −システム障害が発生した場合でも、コミットされたトランザクションの結果または効果が持続することを保証します。
トランザクション制御
トランザクションを制御するために使用される次のコマンドは次のとおりです。
BEGIN TRANSACTION −トランザクションを開始します。
COMMIT −変更を保存するには、代わりに次を使用できます END TRANSACTION コマンド。
ROLLBACK −変更をロールバックします。
トランザクション制御コマンドは、DMLコマンドINSERT、UPDATE、およびDELETEでのみ使用されます。これらの操作はデータベースで自動的にコミットされるため、テーブルの作成中または削除中には使用できません。
BEGINTRANSACTIONコマンド
トランザクションは、BEGINTRANSACTIONまたは単にBEGINコマンドを使用して開始できます。このようなトランザクションは通常、次のCOMMITまたはROLLBACKコマンドが検出されるまで持続します。ただし、データベースが閉じられた場合、またはエラーが発生した場合、トランザクションもロールバックします。以下は、トランザクションを開始するための簡単な構文です。
BEGIN;
or
BEGIN TRANSACTION;
COMMITコマンド
COMMITコマンドは、トランザクションによって呼び出された変更をデータベースに保存するために使用されるトランザクションコマンドです。
COMMITコマンドは、最後のCOMMITまたはROLLBACKコマンド以降のすべてのトランザクションをデータベースに保存します。
以下は、COMMITコマンドの構文です。
COMMIT;
or
END TRANSACTION;
ROLLBACKコマンド
ROLLBACKコマンドは、データベースにまだ保存されていないトランザクションを元に戻すために使用されるトランザクションコマンドです。
ROLLBACKコマンドは、最後のCOMMITまたはROLLBACKコマンドが発行されてからのトランザクションを元に戻すためにのみ使用できます。
以下は、ROLLBACKコマンドの構文です。
ROLLBACK;
Example
次のレコードを持つ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