ここではデータベースの機能の1つであるトランザクション管理について学習します。多くのデータベースプロダクトはSQLを実行するだけでなく、ユーザの認証機能を提供したり、バックアップ・リストア機能を提供したり、検索速度を高めるためにインデックスという仕組みを提供したり、さまざまな機能を提供しています。そのようなデータベースのプロダクトの持つ機能の一つにトランザクション管理があります。
トランザクションとは "取引" を意味する言葉で、トランザクション管理とはデータベースに対する「分割できない一連の処理(SQL)」を制御する仕組みです。ここで「分割できない一連の処理」という言葉を使いましたが、簡単にいえば複数のSQLをまとめて実行するシーンをイメージしてもらえれば大丈夫です。関係性のある複数のSQLを実行するとき、ほとんどのSQLが正しく処理できたとしてもそのうち1件のSQLが失敗すると更新結果に不整合が生まれることがあります。たとえば次のようなケースを考えてみましょう。
トランザクションの例
ここでは銀行のA口座(残高 ¥100,000
)から、指定のB口座(残高 ¥50,000
)に振り込みを行うケースを考えてみましょう。
ここでA口座からB口座に振り込む金額を ¥10,000
とした場合、以下の2つの処理(SQL)が必要です。
- A口座に対してのSQL(
update
文):残高を-¥10,000
する処理 - B口座に対してのSQL(
update
文):残高を+¥10,000
する処理
この2つのSQLには関係性があるので、仮に1つ目のSQLが成功して、2つ目のSQLが失敗すると不正な結果となってしまいます。そのため、この2つのSQLは"分割できない一連の処理"であるといえます。このようなSQLは1つのトランザクションとして処理する必要があります。
トランザクションの開始
データベースプロダクトによってトランザクションの開始方法は異なります。MySQLの場合は begin
命令(あるいは start transaction
) を使えばトランザクションを開始できます。トランザクションを開始したあとに、実行したSQLはすぐにはデータベースには反映されずにあとの命令を待つことになります。
コミットとロールバック
トランザクション管理を行う上で、コミット( commit
)とロールバック( rollback
)という考え方が重要です。トランザクション管理におけるコミットとは一連のSQLの処理結果を確定する(データベースに反映する)という意味です。一方のロールバックとは一連のSQLの処理結果を取り消すという意味になります。
MySQLでは begin
命令によって開始したトランザクションを commit
命令でコミット、rollcack
命令でロールバックできます。
またデータベースプロダクトによって、トランザクションの中で処理中のデータ(コミットされていないデータ)は、コミットされるまで他のユーザには表示されない、などの仕組みが用意されています。このようなトランザクション管理という仕組みによってデータベースは複数ユーザからの同時アクセスを制御しています。