トランザクション処理(SQLiteを学ぶ_22)

SQLiteを学んでいこうという連載の22回目です。前回の記事はこちらになります。

hirocom777.hatenadiary.org

前回は、SQLitePythonから使ってみました。これで色々可能性が広がりますね。

今回はトランザクション処理です。トランザクション処理はデータベース管理システムの処理方法の1つです。どんな処理なのでしょうか?

トランザクションとは

データベースにおけるトランザクションとは複数のデータベース処理をまとめた単位のことです。そして、トランザクション処理とは 「データベースの一連の操作を1つの論理的な単位としてまとめ、処理の完了を保証する仕組み」のことです。

以下のSQL文を実行してみましょう。

sqlite> CREATE TABLE sample(id INTEGER UNIQUE,name TEXT,age INTEGER);
sqlite> INSERT INTO sample VALUES(1,"TANAKA",25);
sqlite> INSERT INTO sample VALUES(1,"YAMADA",30);
Runtime error: UNIQUE constraint failed: sample.id (19)

上の処理ではid列にUNIQUE制約が設定されています。idの番号が重複しているので、2番目のレコード登録はエラーが発生します。テーブルsampleの内容を確認してみると、

sqlite> SELECT * FROM sample;
┌────┬──────────┬─────┐
│ id │   name   │ age │
├────┼──────────┼─────┤
│ 1  │ 'TANAKA' │ 25  │
└────┴──────────┴─────┘

このように、最初のレコードのみ登録されています。ここで、一連の処理は必ず実行しなければならず、できない場合は全体をキャンセルしたいものとしてみましょう。このような場合にトランザクション処理を行います。

トランザクション処理の例

それではトランザクション処理の例を見てみましょう。上との違いは2行目の「BEGIN TRANSACTION」ですね。

sqlite> CREATE TABLE sample(id INTEGER UNIQUE,name TEXT,age INTEGER);
sqlite> BEGIN TRANSACTION;
sqlite> INSERT INTO sample VALUES(1,"TANAKA",25);
sqlite> INSERT INTO sample VALUES(1,"YAMADA",30);
Runtime error: UNIQUE constraint failed: sample.id (19)
sqlite> SELECT * FROM sample;
┌────┬──────────┬─────┐
│ id │   name   │ age │
├────┼──────────┼─────┤
│ 1  │ 'TANAKA' │ 25  │
└────┴──────────┴─────┘

ここまでは上の結果と同じです。ここで、エラーが発生したので登録処理全体をなかったとにしてみましょう。

sqlite> ROLLBACK TRANSACTION;
sqlite> SELECT * FROM sample;
sqlite>

最初のレコードも登録されなくなりました。「ROLLBACK TRANSACTION」を実行すると、「BEGIN TRANSACTION」以降の処理を取り消してトランザクション処理を終了します。テーブルは作成されていますが、レコードは登録されていません。 エラーがなかったレコードの登録を有効にして、トランザクション処理を終了する場合は「COMMIT TRANSACTION」を実行します。上記の代わりに以下を実行してみましょう。

sqlite> COMMIT TRANSACTION;
sqlite> SELECT * FROM sample;
┌────┬────────┬─────┐
│ id │  name  │ age │
├────┼────────┼─────┤
│ 1  │ TANAKA │ 25  │
└────┴────────┴─────┘

今度は最初のレコード登録が維持されています。このようにトランザクション処理を使うと、まとまった処理の実行完了を保証できます。

トランザクションの自動適用

SQLiteではトランザクション処理の開始を明示しなかった場合でも、データを変更するコマンドが実行されるたびに、自動でトランザクション処理が開始され、コマンドの終了とともにトランザクション処理も終了します。

次回もトランザクション

いかがでしょうか。トランザクション処理はデータベース管理システムの信頼性を確保するために欠かせない機能です。次回も引き続きトランザクション処理取り組みます。お楽しみに!!

hirocom777.hatenadiary.org

SQLite学習記事のまとめですはこちらから