• 締切済み

トランザクション処理

トランザクション処理で、 1.カートの数量を使って商品の在庫数を減算する 2.foreachを使って1商品ずつ取り出し、該当する在庫数を減算する 3.ログインユーザーのカート情報を削除する の処理を行うには以下のコードをどのように修正すればいいですか? phpmyadminで作成したテーブル情報は以下の通りです。 cartテーブル(ユーザがカートに追加した商品の情報)が cart_id, user_id, item_id, amount, create_date, update_date productテーブル(商品情報)が id, name, price, img, status, create_date, update_date item_stockテーブル(在庫情報)が stock_id, item_id, stock, create_date, update_date です。 $dbh->beginTransaction(); // トランザクション開始 // cartテーブルとitem_stockテーブル try { // 現在ログインしているユーザーのカート情報を削除する $sql = 'DELETE FROM cart WHERE user_id = ?'; $stmt = $dbh->prepare($sql); $stmt->bindValue(1, $user_id, PDO::PARAM_INT); $stmt->execute(); foreach ($data as $key => $rec) { $stock = (int)$rec['stock'] - (int)$rec['amount']; } // 在庫テーブルを更新 // カートの数量を使って商品の在庫数を減算する // foreachで1商品ずつ取り出し、該当する在庫数を減算する $sql = 'UPDATE item_stock SET stock = ?, update_date = ? WHERE item_id = ?'; $stmt = $dbh->prepare($sql); $stmt->bindValue(1, $stock, PDO::PARAM_INT); $stmt->bindValue(2, $date, PDO::PARAM_STR); $stmt->bindValue(3, $item_id, PDO::PARAM_INT); $stmt->execute(); $carts = $dbh->commit(); $success_msg[] = '在庫数を更新しました。'; } catch (PDOException $e) { // ロールバック処理 $dbh->rollback(); $err_msg[] = '在庫数の更新に失敗しました。' . $e->getMessage(); }

みんなの回答

回答No.1

・言語は解らないのですが、普通sqlを使って処理を実行し、その結果をsqlコードという形式で取得しその結果でcommitするか、rollbackするかを判定するのですが、try and catchのみの判定でrollbackしているのは正しいですか?  ・いきなりdelete分が発行されているのですが、どこからどこまでを1つのトランザクションとするか を判断するため、transactionstartとtransactionendの構文が必要なのですがそれがソースの中にみあたらないのです。端折っている部分に入っているのでしょうか?このとき、commitの段階でtransactionstartしてない等のメッセージがsqlコードとして返ってくるはず!) ・各々のsql発行にてsqlコードによる失敗のための判断(この場合もrollbackが必要)見当たりません。  (sqlの実行は成功しても更新が成功したとは限らない!たとえば他ユーザーが捕まえていた。デッドロック   が発生した等(この場合catchはしない)sqlコードの内容については使っているRDBのsqlコードでググって確認     してください。 ・もうひとつの確認として、環境設定により(言語にもよる)のですが自動commitというものがあります。これも確認事項ですね!

関連するQ&A