💨

【フロントエンドが初めて触る DB 】トランザクションをサッカーで例えてみた

2024/10/15に公開

概要

以前、
【フロントエンドが初めて触る Rails 】controllerのテストでこけたらmodelのafter_saveを疑う!
という記事を書いた際に、after_saveなどのコールバックを調べていると、トランザクションという言葉によく出会していました。

なんとなく、データの整合性を保つために成功を保証するみたいな感じなのかなぁとふわっとした理解をより明確にするためにトランザクションについて自分の言葉で整理してみました。

トランザクションとは

複数のSQL文を一連の処理として1つにまとめて、処理前後のデータの整合性を保つもののようです。
もし一連の処理が完了すれば、DBへ書き込みを行い、失敗した時はそれまでの処理はなかったことにできます。
調べるてみると、トランザクションには2種類ありました。

  • 一連の処理が完了した際に変更を書き込むCOMMIT
  • 一連の処理が失敗した際に変更を取り消すROLLBACK
    • SAVEPOINTを指定することで、処理失敗後にそこまで戻ることができる
BEGIN #トランザクション開始の合図

#一連の処理
INSERT
UPDATE
DELETE

COMMIT #トランザクション終了の合図
BEGIN #トランザクション開始の合図

#一連の処理
INSERT
SAVEPOINT #ROLLBACKした時にこの処理まで戻る
UPDATE
DELETE

ROLLBACK #トランザクション終了の合図

トランザクションをサッカーで例えてみた

トランザクションについて調べていると、例として「Aさんがお金をBさんに送金する時」など金融システム関連を例に挙げていることが多い気がしました。

同じ例では自分の言葉にできたと感じられない...!
なので、自分の好きなサッカーで例を挙げてみたいと思います。

例えば、リーグアンのモナコがイングランドプレミアリーグのリヴァプールから南野選手と締結した契約処理で考えてみます。

契約交渉開始

[モナコ]:リヴァプールさん、南野選手いただけない?
[リヴァ]:おお、いい選手ですよ!ちなみに、おいくらで?
[モナコ]:移籍金ボーナスこみこみで1800万ユーロでどうですか!?
[リヴァ]:よし!OKです!じゃあ早速契約しましょう!

問題なく契約締結(True Story)

[モナコ]:よし、あとはメディカルチェックのみ完了すれば契約締結だな。
[モナコ]:メディカルチェックも特に滞りなく契約締結ですね!
[リヴァ]:いやぁそうですね!南野もモナコさんもうちも三方良しのWin-Win-Winですね!

無事契約が完了し契約金が支払われ、後にモナ王としてリーグアンベストイレブンに入る活躍をするのであった。

例外が発生し契約締結されず(If Story)

[モナコ]:よし、あとはメディカルチェックのみ完了すれば契約締結だな。
[モナコ]:あれ?事前に聞いていなかった怪我がある...!リヴァプールさん...!?
[リヴァ]:...

双方契約金も納得し、あとはメディカルチェックさえ通過すれば契約が完了していたが、最後の最後に事前に知らされていなかった怪我が発覚。
契約が締結され契約金が動くことはなかった...

まとめ

南野選手は契約行程の全てを完了したことによってリヴァプールからモナコに移籍することができました。
契約という一連の流れはトランザクション、契約行程の処理の一つ一つはSELECTUPDATEなどの処理一つ一つとなっており、全て完了しなければ書き込みは行われず、全て完了すればCOMMITで書き込みが行われるという一連の処理の前後で整合性を保証するものということがわかりました。

True Storyではメディカルチェックも完了し、全ての契約行程が完了したためCOMMITによって契約金が支払われ、しモナコでプレーすることが可能になります。
また、If Storyではメディカルチェックを失敗してしまいましたが、SAVEPOINTを使うと、例えば契約交渉が途中でうまくいかなくなった時に最初からやり直す必要はなく、SAVEPOINTを設定した時点まで戻って再度その部分から処理をやり直すことも可能です。
実際にサッカーでも怪我の回復を待ってから契約し直すという事例もあるそうです。

Discussion