SQLite トランザクション(Transaction)

トランザクション(Transaction)は、データベースに対して実行される作業単位です。トランザクション(Transaction)は、論理的な順序で完了する作業単位または一連の操作であり、ユーザーが手動で行うことも、何らかのデータベースプログラムによって自動的に行うこともできます。

トランザクション(Transaction)とは、データベースを変更する1つ以上の操作のまとまりを指します。例えば、レコードを作成したり、レコードを更新したり、テーブルからレコードを削除したりする場合、そのテーブル上でトランザクションを実行していることになります。データの整合性を確保し、データベースエラーを処理するために、トランザクションを制御することが重要です。

実際には、多くのSQLiteクエリを1つのグループにまとめ、それらをすべてトランザクションの一部としてまとめて実行することができます。

トランザクションの属性

トランザクション(Transaction)には、次の4つの標準的な属性があり、通常は頭文字をとってACIDと呼ばれます:

  • 原子性(Atomicity):作業単位内のすべての操作が正常に完了することを保証します。そうでない場合、トランザクションは障害発生時に終了し、以前の操作も以前の状態にロールバックされます。

  • 一貫性(Consistency):正常にコミットされたトランザクションによって、データベースの状態が正しく変更されることを保証します。

  • 分離性(Isolation):トランザクション操作を互いに独立させ、透過的にします。

  • 永続性(Durability):コミット済みトランザクションの結果または効果が、システム障害が発生した場合でも存在し続けることを保証します。

トランザクション制御

以下のコマンドを使用してトランザクションを制御します:

  • BEGIN TRANSACTION:トランザクション処理を開始します。

  • COMMIT:変更を保存します。または、END TRANSACTIONコマンドを使用できます。

  • ROLLBACK:実行した変更をロールバックします。

トランザクション制御コマンドは、DMLコマンドのINSERT、UPDATE、DELETEと一緒にのみ使用されます。これらの操作はデータベース内で自動的にコミットされるため、テーブルの作成や削除の際には使用できません。

BEGIN TRANSACTION コマンド

トランザクション(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
その他の拡張