プログラムのブラッシュアップ(トランザクションの実装)
トランザクションを管理するためには、これまで実装したプログラムをいくつか変更する必要があります。
まずは、データベーステーブルを作り直す必要があるので、サンプルソースのsql
フォルダの中のcreate_table.sql
というファイルをメモ帳などで開いてください。開いたら、ブラウザからphpMyAdminにアクセスをします。次に左メニューから[ec
]をクリック、更に上のツールバーで[SQL]タブをクリックし、create_table.sql
の内容をすべてコピーペーストし[実行する]ボタンをクリックしてください。この時、これまでの注文履歴はいったんすべて削除されるので、注意してください。
「SQLは正常に実行されました」と画面に表示されることを確認してください。
この作業はMySQLの「ストレージエンジン」を変更するために行った作業です。ストレージエンジンとは、MySQLが内部的に用いるエンジンのことで、このエンジンによってMySQLが内部に持つデータの格納の仕方が変わってきます。エンジンはテーブルごとに指定できます。エンジンは何種類も存在しますが、「MyISAM
(マイアイサム)」か「InnoDB
(インノディービー)」のいずれかを用いることが大半です。現在のテーブルはCREATE TABLE
文で特にエンジンの指定をしていなかったため、MyISAM
で動作しています。しかし、MyISAM
は高速に動作する代わりにトランザクション機能が使えません。従って、先ほどのSQLでトランザクションをサポートするInnoDB
に変更しました。
InnoDB
をエンジンとしたテーブルを作成するには、CREATE TABLE
文の末尾に次の一文を付け加えます。
ENGINE=InnoDB
MyISAM
とInnoDB
の違いに関する詳細は、MySQL、MyISAMとInnoDBを選ぶ方法(マイコミジャーナル)などを参考にしてください。
次に、include
フォルダにあるdatabase.php
を変更します。これまでdatabase.php
においては、
PEAR::setErrorHandling( PEAR_ERROR_CALLBACK, "handleError" ); function handleError( $error ) { die("エラーが発生しました。管理者までお問い合わせ下さい。"); }
と記述しており、エラーが発生した場合は「エラーが発生しました。管理者までお問い合わせください。
」のメッセージを表示し、処理を中断するようにしていましたが、ここにrollback
する処理を追加することができないので、次のように「/*
~*/
」形式でコメントアウトしてください。
/* // エラー発生時の処理 PEAR::setErrorHandling( PEAR_ERROR_CALLBACK, "handleError" ); function handleError( $error ) { die("エラーが発生しました。管理者までお問い合わせ下さい。"); } */
次に、cart.php
にトランザクション処理を行うPHPプログラムを埋め込みます。116行目付近の「カート内の合計金額を計算する」のコメント文の1行前に、以下のプログラムを追記してください。
// トランザクション開始 $mdb2->beginTransaction();
次に、140行目付近の「$is_order_done = 1
」の1行後に、以下を追記してください。
// トランザクションのコミット $mdb2->commit();
これで、処理が正常に終了した場合は、コミットされデータベースに反映されます。
次にエラー処理を記述します。create_purchase
関数内の、「$mdb2->prepare( )
」命令の次の行に、以下を追記してください。
// エラー処理 if ( PEAR::isError( $stmt ) ) { $mdb2->rollback(); die("エラーが発生しました。管理者までお問い合わせ下さい。"); }
同じく、「$stmt->execute( )
」命令の次の行に、以下を追記してください。
// エラー処理 if ( PEAR::isError( $res ) ) { $mdb2->rollback(); die("エラーが発生しました。管理者までお問い合わせ下さい。"); }
同じ要領で、create_purchase_detail
関数にもエラー処理を追記してください。これらの追記の仕方が分からない場合は、サンプルソースの「STEP2_Trans
」フォルダにcart.php
およびdatabase.php
(include
フォルダ内)の完成版があるので参考にしてください。
それでは、動作確認をしてみましょう。まず、正しく注文完了した際に、これまでどおりデータベースに注文情報が書き込まれていることを確認しましょう。コミット処理が正しく動作していることが分かるはずです。
次に、正しく動作しなかった場合のロールバックの動作確認です。今回は、create_purchase_detail
関数で実行するSQLを故意に間違えることで動作確認してみます。
create_purchase_detail
関数内の、
$res = $stmt->execute( array( $order_id, $item_code, $price, $num ) );
の部分を書き換え、
$res = $stmt->execute( array( $order_id, $item_code, $price, //$num ) );
のように、$num
の部分をコメントアウトし、画面から注文確定してみます。d_purchase
テーブルのみに、中途半端にデータが登録されていないことを確認してください。
ここでは、簡易な動作確認のためプログラムを直接書き換えましたが、実際にはプログラムを書き換えて動作確認することはあまり好ましくありません。そのため実務では、動作確認(テスト)専用のツールを用いたり、動作確認専用のプログラムを記述したりすることもあります。