
お世話になります。
現在、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で質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
phpのheader("Location:#pos")...
-
PHP8でWarning:Undefined varia...
-
フォームで戻った際に入力済み...
-
csvファイルについて教えて下さ...
-
セッション関数を使わずにファ...
-
composerをインストールしたい...
-
SplFileObject を利用したとき...
-
PHPSpreadsheetによる書き出し...
-
phpの問い合わせフォームを作っ...
-
marginの値でマイナス値を設定...
-
submitで思うようにページが遷...
-
HTML PHP ラジオボタンのイベント
-
php でqiitaのサイトにあったフ...
-
PHPの勉強してます。 配列のと...
-
BASIC認証のフォームをデザイン...
-
アップロードファイルを表示す...
-
複数のパソコンの中の1つのパソ...
-
返信機能のツリー構造の深さを...
-
PHPについて。
-
PHPからCSVをアップロード後、m...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Pro*Cの構文エラー
-
JAVA SQLServerException 列名 ...
-
<VB.NET>INSERT文でDBにデータ...
-
insert1つの処理でもトランザ...
-
ResultSetインターフェイスでの...
-
VBA ACCESS SQL...
-
MySQL 複数の同じような命令が...
-
ASPでSQL文を使う場合に。
-
VB勉強中
-
PHPからデータベースに接続した...
-
VB.NET エラーになる箇...
-
SQLインジェクション対策
-
sqliteの構造体
-
Q&Aサイトを作成していてURLの...
-
データベースに存在するデータ...
-
C#でDBの特定列をUpdate
-
エクセルVBAのデータベース接続...
-
チェックボックスからの複数検...
-
SQL文の連結が、うまくいきません
-
CakePHPでquery()を使うときに...
おすすめ情報