English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

SQLite トランザクション

取引はデータベースに対して実行される作業単位です。取引は論理的な順序で完了する単位または作業順序であり、ユーザーが手動で完了するか、あるいはデータベースプログラムが自動的に完了するかに関わらずです。

取引はデータベースに変更を適用するための単位です。例えば、テーブルにレコードを作成、更新、または削除する場合、テーブルに対して取引を実行します。データの整合性を確保し、データベースエラーを処理するために取引を制御することは重要です。

実際には、多くのSQLiteクエリを一つのグループにまとめ、それらを取引の一部として一括して実行します。

取引属性

取引は以下の4つの標準属性を持ち、ACIDと略されることが一般的です。

  • 原子性(Atomicity):作業単位内の全ての操作が成功完了するようにしてください。それができない場合、障害が発生したときに取引は終了し、前の操作も元の状態に戻されます。

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

  • 孤立性(Isolation):トランザクション操作が相互に独立して透明であることを確保します。

  • 持続性(Durability):システムが故障した場合でも、コミットされたトランザクションの結果や効果が確実に存在することを保証します。

トランザクションコントロール

以下はトランザクションを制御するための以下のコマンドです:

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

  • COMMIT−変更を保存するために、以下を使用することもできますEND TRANSACTIONコマンド。

  • ROLLBACK −変更を取り消します。

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

BEGIN TRANSACTION コマンド

BEGIN TRANSACTIONを使用したり、単にBEGINコマンドを使用することでトランザクションを開始できます。このようなトランザクションは、次のCOMMITやROLLBACKコマンドに達するまで続きます。ただし、データベースが閉じられたり、エラーが発生した場合、トランザクションもロールバックされます。以下はトランザクションを開始するシンプルな文法です。

BEGIN;
または 
BEGIN TRANSACTION;

COMMIT コマンド

COMMITコマンドは、トランザクションコールの変更をデータベースに保存するためのトランザクションコマンドです。

最後のCOMMITやROLLBACKコマンドから、COMMITコマンドはすべてのトランザクションをデータベースに保存します。

以下はCOMMITコマンドの文法です。

COMMIT;
または
END TRANSACTION;

ROLLBACK コマンド

ROLLBACKコマンドは、まだデータベースに保存されていないトランザクションを取り消すためのトランザクションコマンドです。

COMMITやROLLBACKコマンドが最後に発行されてから、ROLLBACKコマンドはトランザクションを取り消すためにのみ使用できます。

以下はROLLBACKコマンドの文法です。

ROLLBACK;

オンラインサンプル

以下のレコードを持つCOMPANYテーブルがあります。

ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
1           ポール        32          カリフォルニア  20000.0
2           Allen       25          テキサス       15000.0
3           テディ       23          ノルウェイ      20000.0
4           Mark        25          Rich-Mond   65000.0
5           デビッド       27          テキサス       85000.0
6           キム         22          サウス-ホール  45000.0
7           ジェームズ       24          ヒューストン     10000.0

今、トランザクションを開始し、age = 25のテーブルからレコードを削除し、その後ROLLBACKコマンドを使用してすべての変更を取り消します。

sqlite> BEGIN;
sqlite> DELETE FROM COMPANY WHERE AGE = 25;
sqlite> ROLLBACK;

今、COMPANYテーブルを確認すると、以下のレコードがまだあります-

ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
1           ポール        32          カリフォルニア  20000.0
2           Allen       25          テキサス       15000.0
3           テディ       23          ノルウェイ      20000.0
4           Mark        25          Rich-Mond   65000.0
5           デビッド       27          テキサス       85000.0
6           キム         22          サウス-ホール  45000.0
7           ジェームズ       24          ヒューストン     10000.0

もう一つのトランザクションを開始し、AGE = 25のテーブルからレコードを削除し、最後にCOMMITコマンドを使用してすべての変更をコミットします。

sqlite> BEGIN;
sqlite> DELETE FROM COMPANY WHERE AGE = 25;
sqlite> COMMIT;

COMPANY テーブルがまだ以下のレコードを持っている場合、今すぐチェックします-

ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
1           ポール        32          カリフォルニア  20000.0
3           テディ       23          ノルウェイ      20000.0
5           デビッド       27          テキサス       85000.0
6           キム         22          サウス-ホール  45000.0
7           ジェームズ       24          ヒューストン     10000.0