データベースのトランザクション管理
MySQLへのデータ登録方法は理解できましたか?
前回の勉強ではクエリーが実行されると即データベースが更新されますが、それではいろいろ困るケースが出てきます。
ここではデータベースのトランザクション管理に関して簡単に触れておきます。
詳しくはご自身で専門書を熟読する事をお薦めします。
トランザクション管理
例えば、ネットショップサイトでAという商品の売り上げが確定した場合、注文データテーブルに販売内容(氏名・住所・電話番号・商品名・個数・etc…)というデータが登録され、商品マスターテーブルには、販売された商品の在庫数を売れた分だけ減算しなければなりませんね。
どちらのデータも同時に更新されるべきで、処理の順番はともあれ、「注文だけ登録されてマスターは減算されなかった」とか、「マスターは減算したけど、注文データは登録できなかった」という事は販売管理システムではあってはならない事です。
このような矛盾が生じないよう、データベースにはトランザクション管理というものを利用します。
以下がトランザクション処理の一般的なコーディング方法です。
(PHPマニュアルから引用)
/* Start transaction */
$mysqli->begin_transaction();
try {
/* Insert some values */
$mysqli->query("INSERT INTO language(Code, Speakers) VALUES ('DE', 42000123)");
/* Try to insert invalid values */
$language_code = 'FR';
$native_speakers = 'Unknown';
$stmt = $mysqli->prepare('INSERT INTO language(Code, Speakers) VALUES (?,?)');
$stmt->bind_param('ss', $language_code, $native_speakers);
$stmt->execute();
/* If code reaches this point without errors then commit the data in the database */
$mysqli->commit();
} catch (mysqli_sql_exception $exception) {
$mysqli->rollback();
throw $exception;
}
$mysqli->begin_transaction();
でトランザクション管理のスタートが宣言され、以降
$mysqli->commit();
が実行されるまで、データベースへの更新が完了しません。
簡単に説明すると、「begin_transaction」でトランザクション領域が用意され、以降のデータベース・登録・更新・削除処理はこのトランザクション領域に記録され、データベースにはまだ反映されていないというイメージです。
全ての処理がエラーを発生することなく問題なく処理されたら、「commit」の命令にて、トランザクションに記録された処理が確定します。
逆にいうと、「commit」が実行される前に何らかのエラーが発生した場合、begin_transaction以降の処理が全て破棄し、データベースをbegin_transaction実行前の状態に戻せば問題なくなります。
それを実行するのが
$mysqli->rollback();
です。
これで、注文テーブルにだけデータが登録され、商品マスターの減算が行われなかったという現象を回避できます。
try {
} catch (mysqli_sql_exception $exception) {
} finally {
}
データベース処理をコーディングする際は必ずこのtry-catch-finaryを使用しましょう。
例外が発生した場合catchブロックにスローされた例外を処理する事が出来ます。
try{ }の中で処理を実行、
chatch{ }の中でエラー処理(rollback)
finally{ }の中で後処理
この構造は十分に理解して下さい。
フォームからPOSTされた内容をデータベースに登録するまで簡単に解説しましたが、ここまでを理解できれば、他の不明点はググって出てくる様々なサイトに解説されている内容が理解できるはずです。
HTML,CSS,javasprict,PHP,MySQL,フレームワーク,テンプレートエンジン、、、
優秀なプログラマーの方たちは上記の内容は勿論、その他にプロトコル等に関する知識等ももって仕事に取組み、どんどん基本的な知識の習得は勿論、新しい技術(AI,VRなどなど)もいち早く吸収していきます。
頑張って一流プログラマーを目指して下さい。
コメント