閲覧頂きありがとうございます
PHPのPDOを利用した同時接続の件で質問です。
例えばAとB二人のユーザーがいたとして、Aがまずページにアクセスし5秒後にBがアクセスしたとします。
その時AのDB追加処理のみうごかし、BはDBを参照するだけ。というふうにしたいです。
調べた所、Aがアクセスした段階でロックをかければいい。という感じの記載がありましたので自分なりにやってみたのですが、どうにもうまくいきません。
どなたかご教授いただけませんでしょうか?
PHP
1require( dirname( __file__ ) . "/sample.php" ); //DBを$pdoに格納 2 3$sql = "SELECT * FROM sample "; 4$result = $pdo->query( $sql ); 5$datas = $result->fetch( PDO::FETCH_ASSOC ); 6print_r( $datas ); 7//ここまでは必ず出るように 8try { 9 10 $pdo->beginTransaction(); 11 //新規追加が動いていなければ10秒待ってから追加 12 sleep( 10 ); 13 $sql = 'INSERT INTO (name,url,bangou) VALUE (?,?,?)'; 14 $prepare = $pdo->prepare( $sql ); 15 $prepare->bindValue( 1, "yamada" ); 16 $prepare->bindValue( 2, 11 ); 17 $prepare->bindValue( 3, 22 ); 18 $prepare->execute(); 19 $pdo->commit(); 20} catch ( PDOException $e ) { 21 22 //すでに新規追加が動いていれば下記のechoを出力 23 $dbh->rollBack(); 24 echo "エラー出力"; 25}
追加は基本的に問題なくされますが、Aがアクセスしてから5秒後にBがアクセスしても、2つとも新規で追加されてしまいます。
これをAのみ追加され、BはDBを参照はできるが、追加はされず、DB内のデータと”エラー出力"とだけ出るようにしたいです。
なにか根本的に間違えているのでしょうか?
またもう一つききたいのですが、
$pdo->commit();
これで一時的にためていたものをDBに追加する。と書いていたのですが、これを外した場合も、問題なく追加されます。
なぜなのかご教授いただけると幸いです。
よろしくお願いいたします!
追記
ikedasさん
ご返答ありがとうございます。
指定頂いたページは一通り目を通しておりました・・・ただ理解力がないため、出来ませんでした。
データベースはMySQL 5.6.36です。
Kosuke_Shibuyaさん
ご返答ありがとうございます。
たとえば、1時間に一度、自分の他のサイトを見に行き、データを取ってきて、それをDBに格納する。という処理を考えております。
そのため、AとBがほぼ同時に来た場合、ロックを掛けておかないと取得している時に、Bも同じものを取得してきて、同じモノが2度登録されてしまうのでは無いかと考えておりました。
別の方法でも、なにかいい方法があればご教授頂けると幸いです。


回答4件
あなたの回答
tips
プレビュー