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