PHPに以下をプログラミング。
//トランザクション開始 mysql_query("begin") or die("トランザクション開始 失敗"); //トランザクション コミット mysql_query("commit") or die("コミット 失敗"); //トランザクション ロールバック mysql_query("rollback") or die("ロールバック 失敗");
ネットでいろいろ調べたかぎりでは上記だけで簡単にトランザクション管理ができると書いてある。
しかし、何度もテストしてみてもロールバックが正常に動作していない。
他に何か原因があるのか?と思い、再度調べてみると、テーブルタイプがMyISAMだとトランザクションがサポートされていないとのこと。
さっそくテーブルタイプをInnoDBに変えてみる。
うん。ロールバックが正常に動作している。
初めてテーブルタイプっていうのを知ったけど、トランザクション管理を行うとなるとちゃんと意識しとかないといけないとこだな。
MyISAMとInnoDBの違いについては以下を参考にした。
【MyISAMの特徴と問題点】
- 特徴: デフォルトのテーブルタイプ
- 特徴: シンプル
- 特徴: 高速に動作
- 特徴: フルテキスト検索に対応
- 欠点: トランザクションや外部キー制約をサポートしない
- 欠点: REPAIR TABLEで修正できることが多いがクラッシュ時に使えなくなる
- 欠点: テーブルレベルでロックをかけるという点でロックの粒度が荒い
【InnoDBの特徴と問題点】
- 特徴: トランザクションをサポート
- 特徴: 外部キー制約をサポート
- 特徴: クラッシュ時のリカバリに対応
- 特徴: 列レベルでロックを実施
- 欠点: 複雑さが増す
- 欠点: フルテキスト検索ができない
- 欠点: パフォーマンスが悪い
- 用途例: オンラインショップ、金融アプリケーション、データ整合が求められる用途