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