TOP書籍連動> プリペアドクエリとバインド変数(3)
まるごと PHP!
まるごと PHP!

Part3:MySQL拡張サポート(2)

著者:桝形誠二(MASUGATA, Seiji)   2005/3/18
前のページ   1   2
プリペアドクエリとバインド変数(3)

   結果は表2のようになりました(realは総処理時間、userはユーザーCPU時間、sysはシステムCPU時間)。少々ですが、実行効率の向上が確認できます。
表2:プリペアドクエリとバインド変数の有無による性能評価
条件 real user sys
プリペアドクエリとバインド変数を使った場合 12.41 3.25 0.74
プリペアドクエリとバインド変数を使わなかった場合 14.35 3.40 0.76
トランザクション

   MySQL 4.1.2は既定でInnoDBをサポートしており、トランザクション処理が可能です。これに伴い、改良版MySQL拡張サポートでもトランザクション処理の制御ができます(リスト9)。

リスト9:transaction.php
<?
include( "child.inc" );

try{

$ChildMySQLi = new CihildMySQLi( "localhost", "root", "", "testdb" );

$ChildMySQLi->autocommit( false );

$InsertStmt = $ChildMySQLi->prepare( "insert into hoge values( ?, ? )" );

$InsertStmt->bind_param( "is", $No1, $No2 );

for( $XX = 1; $XX <= 5; ++$XX )
{
$No1 = $XX;
$No2 = "test".$XX;
ChildStmt::execute( $ChildMySQLi,$InsertStmt );
}

$Result = $ChildMySQLi->query( "select no1, no2 from hoge order by no1" );

while( $Array = $Result->fetch_assoc( ) )
{
print_r( $Array );
}

$ChildMySQLi->rollback( );
// $ChildMySQLi->commit( );

echo "\n[reTry!!]\n\n";

$Result = $ChildMySQLi->query( "select no1, no2 from hoge order by no1" );

while( $Array = $Result->fetch_array( ) )
{
print_r( $Array );
}

} catch( Exception $Exception ) {

print_r( $Exception->getMessage( )."\n" );

}

?>

   当然ですが、制御できるのはテーブルの型がInnoDBである場合に限ります。テーブルの型をInnoDBにしたい場合は、テーブルを作成するCREATE文の一番最後に「TYPE = InnoDB」を付けます。

   トランザクション処理を破棄したい場合はrollback()メソッド、逆に確定したい場合はcommit()メソッドをそれぞれ利用します。autocommit()メソッドを使うと、自動コミットの有効・無効を定義できます。自動コミットを有効にすると、エラーが発生しない限り、実行した時点でトランザクション処理が確定します。

前のページ   1   2



著者プロフィール
桝形 誠二
様々な言語を経験していく中でPHPと出会い、初心者に易しいという魅力に惹かれ続けて早5年。色んな事をPHPで実装しようとしすぎて周囲の反感を買いやすいのが最近の悩み。


INDEX
Part3:MySQL拡張サポート(2)
  プリペアドクエリとバインド変数(2)
プリペアドクエリとバインド変数(3)