プログラミングにおける「トランザクション」は非常に重要です。ただ、「何か処理するんだな」くらいの認識でなんとなく流している方、いらっしゃらないでしょうか?
この記事ではそんな方のために、
- トランザクションとは何か?(通常の処理との違いは?)
- トランザクションにするメリットや必要性は?
- 一緒によく出てくる「ロールバック」や「コミット」って?
初心者の方にもわかりやすく丁寧に解説します!
1.トランザクション(transaction)とは
もともとは「取引」の意味ですが、プログラムの業界では、そこから転じて「分割不可な一連の処理」のことを指します。要するに、「複数の処理をまとめてしたい」ってことです。
これは、もともとの意味である「取引」から考えるとわかりやすいです。例えば「商品を渡して、代金を受け取る」という取引を考えてみると、必要な処理は次の2つです。
トランザクション(=取引)の例
- 商品を受け取る
- 代金を払う
これらは、どちらか片方だと取引が成立しません。片方では強盗や寄付になってしまいます。全て正しく処理するか、全てなかったことにするか、どちらかです。その一連の処理を「トランザクション」と言います。なら同時に行えば良いじゃないか、と思う気持ちもわかりますが、厳密に全く同時に行うというのは非現実的ですし、通常、お互い確認しながら順番に行いますよね。
プログラムも全く同様です。プログラムは、上から1行ずつ処理していくという大原則がありますから、なおさら、「ここからここまではワンセットでまとめて処理したい」という場合には、それらの一連の処理をトランザクションにする必要があります。
2.ロールバックとは(トランザクションの必要性)
でも、どうしてわざわざ「ワンセットだ!」と指定する必要があるのでしょうか? 商品を受け取って、代金を払って、取引成立でそれで良いではないか?
良い質問です。その答えがまさに、トランザクションの有難み、つまりメリットであり必要性です。
答えは、「途中で失敗した場合に、矛盾が生じる(取引が成立しなくなる)のを避けるため」です。トランザクションは、一連の処理が、どこか途中で失敗した場合に真価を発揮するのです。
どういうことか。例えば、先ほどの例で、
お会計という取引(=トランザクション)が途中で失敗した例
- 商品を受取ろうとした→受け取った(成功)
- 代金を払おうとした→残高が足りなかった→代金を払えなかった(失敗)
となったとします。たまにありますよね。ここで、1番目の処理は成功している、すなわち、商品は既に受け取っているわけですが、取引が成立していない以上「一度は受け取ったんだから返さないよ!?」というわけにはいかんでしょう。お金が足りないなら商品を返すのが筋です。つまり、1番目の処理はなかったことになり、戻す作業が必要です。このように、「一連の処理が途中でひとつでも失敗したら、それまでに成功した処理を元に戻してなかったことにする」必要があるのです。
この後半部分、すなわち「それまでの処理を元に戻してなかったことにする」ことを、プログラムの世界では「ロールバック」と言います。
複数の処理をトランザクションにすることで、途中で失敗した場合に、全てをなかったことに出来るのです。一連の処理が途中でひとつでも失敗した場合に、適切にロールバックさせる。そのためにトランザクションにするのだと言っても過言ではありません。
3.コミットとは(トランザクション成功の処理)
別の視点で考えると、「一連の処理が途中でひとつでも失敗したら、それまでに成功した処理を元に戻してなかったことにする」のであれば、1番目の商品を受け取った時点では、その処理はまだ「仮」なわけですね。だって、その後どこかで失敗したら、その処理はなかったことにされるわけですから。全ての処理が正常に行われて初めて、晴れて全ての処理内容が正式に確定するわけです。この確定させる作業を「コミット」と呼びます。
トランザクションまとめ
以上より、トランザクションとは、
少し見方を変えて、
「途中で失敗したときにどこまでロールバックするか、どこまで成功したらコミットするか」を決めておく役割
と言ってもいいかもしれません。
参考文献
こちらの外部記事を参考に、よりわかりやすく丁寧にまとめたつもりです。合わせて読むと、理解が深まるかと思います。
これからプログラミングを学んでいこうと考えている方はこちらもチェック!
少しでも参考になったなら嬉しく思います!
最後まで読んでくださってありがとうございました!
画像提供:Darkmoon_ArtによるPixabayからの画像
コメント