###前提・実現したいこと
トランザクション処理が負荷の面から以下の処理で最適かどうかが知りたいです。
レンタル掲示板のようなサービスだと考えて下さい。
ユーザーの掲示板への投稿と、掲示板管理人の掲示板削除処理が同時に行われた場合(可能性は少ないですが)、掲示板削除が先に行われたら、存在しないはずの掲示板IDで記事がデータベースに保存されてしまうかと思います。
外部キーをつけろ等は今回は一切なしでお願いします。
上部の「$bbs_data = fetchBbs($bbs_id)」で一度掲示板が存在するか確認&設定値を取得する処理を入れていますが、整合性のために記事投稿前に再度掲示板が存在するかのチェックをSELECT FOR UPDATEで入れないとダメでしょうか。
2回掲示板の存在を確認するとすごく無駄なように感じてしまいます。
相当なアクセス数がある場合は、1クエリでも減らしたいものです。
他に良いチェック方法等がありましたら、教えて頂けますと幸いです。
よろしくお願いします。
※サンプルソースコードはかなり簡略化しセキュリティ等は一切考慮していません。あくまでもイメージです
###該当のソースコード
PHP
1<?php 2// 掲示板ID取得 3$bbs_id = isset($_GET['bbs_id']) ? $_GET['bbs_id'] : ''; 4 5// 掲示板が存在するか確認 6if ( !($bbs_data = fetchBbs($bbs_id)) ) { 7 404エラーページ表示(); 8} 9 10/** 11 * $bbs_dataには掲示板名や設定値が入っているとします 12 */ 13 14// 何かしらの処理 15// 何かしらの処理 16// 何かしらの処理 17// 何かしらの処理 18 19 20// 掲示板への投稿ボタンが押されたとします 21if ($_SERVER['REQUEST_METHOD'] === 'POST') { 22 try { 23 24 トランザクション開始(); 25 26 27 /** 28 * !ここで再度、掲示板が存在するかをSELECT FOR UPDATEでデータベースに問合せないといけないかどうか? 29 */ 30 31 32 // 掲示板へ投稿 33 post($bbs_id, $name, $message); 34 35 コミット(); 36 37 } catch (PDOException $e) { 38 39 ロールバック(); 40 41 } 42}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/09/07 16:21
退会済みユーザー
2016/09/07 16:23
2016/09/07 16:31
2016/09/07 16:32
退会済みユーザー
2016/09/07 16:51 編集
2016/09/08 00:40 編集
退会済みユーザー
2016/09/08 02:02