MySQL、PHP環境でのトランザクションについて
2018年12月20日
データベースを勉強していると、やたら出てくるのが「トランザクション」や「コミット」「ロールバック」という言葉です。
PHPやMysqlでプログラミングで案件に携わっていても、これらのトランザクションという仕組みに遭遇する機会が実はそれほどなかったりするのでイメージとしては掴みづらかったりします。
トランザクションとは
トランザクションとは、複数のSQLの実行処理を1つのまとまりにまとめたものです。
トランザクション内でのSQL実行時に正常に実行できなかったり、何か問題が発生した場合、トランザクション開始時まで巻き戻す(ロールバック)を行います。
分かりやすい例でいうと、銀行口座から別口座への送金がそうです。
ある口座からお金を引き落とす処理を行って、別講座に加算する処理を行うまでの間にシステム障害が発生したとすると、口座からお金が引かれた状態で、別の口座にはお金が加算されていない状態になり、そこから復元できなくなる可能性があります。
これを防ぐのがトランザクションという仕組みで、まとまりの処理が終了するまでの間にエラーが起きたら初期の段階にロールバックをして巻き戻したり、あるいは資源をロックして、他の処理からアクセスできないようにします。
MySQL+PHPのデフォルト仕様
MySQL+PHPではオートコミットがONになっています。
これはどういうことかというと、個別にSQLを実行するたびに自動でCommitを行います。
そのため、SQLは個別に処理されるため、上記のような銀行口座の処理のような仕組みを実装する場合には、トランザクションの仕組みを別途記述して実装しないといけません。
PHPにも begin Transaction commit rollbackといった機能があるため、必要に応じて記述することで、トランザクションの仕組みを利用することが可能です。
自分が現在作成しているSQLのプログラムにトランザクションの仕組みを導入する必要があるかどうかというのは、その処理によるため、必ずしも全ての処理でトランザクションを記述しなければいけないということではありません。
ただし、仕組みとしては理解しておく必要があるでしょう。