トランザクションの使い方
トランザクションは、データベース操作を安全かつ整合性のある状態に保つための重要な機能です。特に、銀行の振込処理のように「Aさんの口座から引くだけでなく、Bさんの口座に入金するまでを一連のセットにしたい」という場合や、途中でエラーが起きたときにすべての操作を真っ新な状態に戻したい(全か無か)という場面で必須となります。この記事では、PythonでSQLiteを使ったトランザクション管理の基本的な使い方について解説します。

トランザクションの基本概念
トランザクションは、データベースに対する一連の操作をまとめて実行し、全てが成功した場合のみ変更を確定する仕組みです。その基本的な流れは以下の通りです。
- トランザクションを開始する
- データベースに対する複数の操作を実行する
- すべての操作が問題なく完了したら、
commit(コミット)で変更を永続化する - 途中で1つでもエラーが発生した場合、
rollback(ロールバック)で元の状態へと巻き戻す
トランザクションを使ったコード例
以下は、try-except-finally文を組み合わせて、安全にコミットとロールバックの制御を行う実装例です。
import sqlite3
# データベースに接続
conn = sqlite3.connect('example.db')
cursor = conn.cursor()
try:
# トランザクションを開始
cursor.execute('BEGIN TRANSACTION')
# 複数のデータベース操作を実行
cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", ('Alice', 25))
cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", ('Bob', 30))
# すべての操作が成功したらコミットして変更を保存
conn.commit()
print("データが正常に保存されました")
except Exception as e:
# エラーが発生した場合はロールバックしてすべての変更を取り消す
conn.rollback()
print("エラーが発生したため、変更を取り消しました:", e)
finally:
# 例外の有無にかかわらず、最後に必ず接続を閉じる
conn.close()
コードの解説と主要なコマンド
上記のコードでは、安全なデータ永続化のために以下の要素を組み合わせています。
BEGIN TRANSACTION: トランザクションの開始を明示します。これ以降のデータ操作はすべて仮保存の状態となります。conn.commit(): 仮保存されていた変更を確定させ、実際のデータベースファイルへと完全に書き込みます。conn.rollback(): エラー検知時に発動し、BEGIN TRANSACTIONが呼ばれた時点の状態までデータを強制的に巻き戻します。途中でデータが不完全なまま残るのを防ぐ防波堤となります。try-except-finally: 予期せぬエラーが起きてもexceptで確実にロールバックを捉え、finallyで確実にデータベースとの接続(コネクション)を解放する、実務における定石のコードパターンです。
トランザクションを利用するメリットと運用のポイント
トランザクションを導入する最大のメリットは、データの一貫性(インテグリティ)を保証できる点にあります。もし途中の処理でシステムがクラッシュしたりネットワークが切断されたりしても、中途半端なゴミデータが残る心配がありません。
一方で、プログラムを書く際には以下のポイントに留意する必要があります。
- ロックの保持時間に注意する: トランザクションを実行している間、データベース内の該当データは他のユーザーから変更されないようにロック(保護)されます。処理が長引くと他のリクエストをブロックしてアプリ全体の遅延に繋がるため、必要な処理が終わったら速やかにコミットまたはロールバックを行いましょう。
- 厳格なエラーハンドリングを行う: 例外を握りつぶして(エラーを無視して)コミットしてしまうと、破損データがそのまま保存されてしまいます。発生しうるエラーを想定し、漏れなくロールバックへ流れる設計にすることが重要です。
まとめ
トランザクションは、データの破壊や不整合を防ぎ、商用アプリケーションの信頼性を担保するための根幹となる機能です。Pythonで生のSQLやSQLiteモジュールを扱う際は、BEGIN TRANSACTIONで始め、commitとrollbackを対にして例外処理の中に組み込む構成を常に意識しましょう。この確実なデータ管理の仕組みをマスターすることで、バグに強く、高トラフィックな環境でも安全に動作するバックエンドプログラムが構築できるようになります。