お世話になります。
現在、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;
※前提として、テーブルを使用するユーザーは多数います。
ご存知の方、ご回答いただけるれば幸いです。
よろしくお願い致します。
No.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();
}
ご回答ありがとうございます。
さらに蛇足、ありがとうございます。
PDO::ERRMODE_EXCEPTIONは有効にしておきたいと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP DBのハッシュ化したパスワードをpassword_verifyで戻し照合したのですが上手く行きません 2 2023/02/06 13:24
- PHP PHP一覧表示した項目にリンクをはりたい 1 2023/07/12 17:08
- PHP 【PHP/MySQL】コード上で生成したクエリを基に集計クエリを作りたい 1 2022/07/28 15:06
- PHP クエリObjectをforeachで回す時に、次のレコードへ移動せずに次のレコードを取得したい 2 2022/07/28 15:29
- PHP 重複を防ぐ記述について教えて下さい。 3 2023/04/03 14:35
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- PHP PHPSpreadsheetによる書き出し時のページネーション方法について 1 2023/03/20 10:35
- Visual Basic(VBA) ExcelからAccessのテーブルに書き込む時に時間がかかる 1 2022/10/14 20:38
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
<VB.NET>INSERT文でDBにデータ...
-
ResultSetインターフェイスでの...
-
insert1つの処理でもトランザ...
-
Pro*Cの構文エラー
-
VB.NETでSQLを作る時のカンマの...
-
JAVA SQLServerException 列名 ...
-
VBA ACCESS SQL...
-
データベースに存在するデータ...
-
【初歩】配列の格納データ数だ...
-
Q&Aサイトを作成していてURLの...
-
実行時エラー3131 FROM 句の構...
-
MySQLでデータベースにデータin...
-
VBAをつかってクエリの情報を抽...
-
テキストボックスに入れた内容...
-
DBで検索結果に該当するデータ...
-
日またぎの計算
-
csvをDBへ読み込んだら、NULLが...
-
SQL文の実行に失敗しました???
-
codeigniter 複数モデルでトラ...
-
縦に長い<table>でなく横に長い...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
JAVA SQLServerException 列名 ...
-
<VB.NET>INSERT文でDBにデータ...
-
ResultSetインターフェイスでの...
-
Pro*Cの構文エラー
-
insert1つの処理でもトランザ...
-
データベースに存在するデータ...
-
VBA ACCESS SQL...
-
INSERT,DELETEを同時に
-
MySQLのINSERT時にたまに重複に...
-
VB.NET エラーになる箇...
-
PHP&MySQLでの文字列+数列の一...
-
PHP初心者です。syntax error, ...
-
php MySQL で、更新ボタンを押...
-
like検索の複数キーワードで、...
-
php postgres Insert と updat...
-
ASPでSQL文を使う場合に。
-
チェックボックスからの複数検...
-
Q&Aサイトを作成していてURLの...
-
php データベースから値を取得する
-
phpでforeach ($stmt as $row)...
おすすめ情報