SQLiteを学んでいこうという連載の22回目です。前回の記事はこちらになります。
前回は、SQLiteをPythonから使ってみました。これで色々可能性が広がりますね。
今回はトランザクション処理です。トランザクション処理はデータベース管理システムの処理方法の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ではトランザクション処理の開始を明示しなかった場合でも、データを変更するコマンドが実行されるたびに、自動でトランザクション処理が開始され、コマンドの終了とともにトランザクション処理も終了します。
次回もトランザクション
いかがでしょうか。トランザクション処理はデータベース管理システムの信頼性を確保するために欠かせない機能です。次回も引き続きトランザクション処理取り組みます。お楽しみに!!