プロが教えるわが家の防犯対策術!

お世話になります。

現在、MYSQLデータベースを使用したプログラムを書いており、
そこでトランザクションについて質問があります。

トランザクションとは、複数の処理がすべて成功した場合に正式な処理を実行(commit)、1つでも失敗した場合は元に戻す(rollback)というようなことかと思うのですが、

では、1つの処理のみの場合は、トランザクションを使用する必要はないのでしょうか?
例えば、

・あるテーブルにデータをinsertしたい。

このような単一の処理を書く場合でも、
以下のようにトランザクションを使うべきでしょうか?

$dsn = 'mysql:dbname=〇〇〇;host=〇〇〇;charset=utf8';
$user = 'user';
$pwd = 'pwd';

//DB接続
try {
$pdo = new PDO($dsn, $user, $pwd);
} catch (PDOException $e) {
die('DB接続失敗');
}

//トランザクション開始
$pdo->beginTransaction();

//INSERT
try {
$sql = 'INSERT into table (test1, test2, test3) VALUES (:a, :b, :c)';
$st= $pdo->prepare($sql);
$ret = $st->execute(array(
':a' => $a,
':b' => $b,
':c' => $c,
));
if (!$ret) {
throw new Exception('INSERT 失敗');
}

//commit
$pdo->commit();

} catch (PDOException $e) {
//rollback
$pdo->rollBack();
}

$pdo = null;

※前提として、テーブルを使用するユーザーは多数います。

ご存知の方、ご回答いただけるれば幸いです。
よろしくお願い致します。

A 回答 (2件)

いいえ、不要ですです。

トランザクションは使えば使うほどパフォーマンスが悪くなるので、使用は最低限に抑えましょう。

(蛇足)

>> if (!$ret) {
>> throw new Exception('INSERT 失敗');
>> }

executeの返り値をチェックして自分で例外を投げるのは二度手間です。PDO::ERRMODE_EXCEPTIONを有効にしましょう。


【推奨される書き方(もしトランザクションを使うのであれば)】


try {
 
 $dsn = 'mysql:dbname=〇〇〇;host=〇〇〇;charset=utf8';
 $user = 'user';
 $pwd = 'pwd';
 $options = array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION);
 
 $pdo = new PDO($dsn, $user, $pwd, $options);
 $pdo->beginTransaction();

 try {
  
  $sql = 'INSERT into table (test1, test2, test3) VALUES (:a, :b, :c)';
  $st= $pdo->prepare($sql);
  $st->execute(compact('a', 'b', 'c'));
  $pdo->commit();
  
 } catch (PDOException $e) {
  
  $pdo->rollBack();
  throw $e;
  
 }

} catch (PDOException $e) {
 
 echo 'Error: ' . $e->getMessage();
 
}
    • good
    • 1
この回答へのお礼

ご回答ありがとうございます。
さらに蛇足、ありがとうございます。
PDO::ERRMODE_EXCEPTIONは有効にしておきたいと思います。

お礼日時:2014/07/06 05:55

commitはしておくべきです。



システムにもよりますが、MYSQL自体が異常終了した場合、
ROLLBACKされてこの処理が無効になるおそれがあるからです。

大型汎用機でDB2で組んでいた時、DB2が異常終了してデータが消えた経験があります。
    • good
    • 0
この回答へのお礼

必要ということですね。
ご回答ありがとうございます。

お礼日時:2014/07/06 05:53

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!