ページを見るとカウントをとるプログラムを書きました。
※idをユニークに設定。mysql使用。
閲覧やリロードでidのレコードデータがない場合は、レコード(numberは1)を挿入。
既にidがある場合は、numberに+1してカウントしていくものです。
$request_data=$pdo->
prepare("
INSERT INTO table
(id,number)
VALUES
(:id,1)
ON DUPLICATE KEY UPDATE
number = number+1
");
$request_data->bindValue(":id",$id);
$request_data->execute();
上記のプログラムだと、挿入や更新自体は問題がありません。
しかし、idの無いデータで挿入を行ったにも関わらず、numberの値が2となったり、更新時に+2されることがあります。
※うまくいく時とうまくいかない時があります。閲覧やリロードは1回のみ。
また、データベースをみていると後から遅れてデータが入ってくる時もあります。
データベースの遅延?トラブル?とも考えられますが、解決法として何が考えられるでしょうか?
あと,トランザクションレベルは変えていますか?
(numberをSELECTしてプログラム側でif文で分岐,だと,リロード時にレコードがダブってしまう)
phpmyadminで簡単につくったものでidにユニークを設定しただけのものです。id,numberともにint(11)。
トランザクションは現状、一切使用していません。これから試してみようと思います。
id|number
----------
1|1
2|6
どうしてこの件がエラーになるのかな…と考えてましたが,
やはりプログラム中の$idの新規発行部分を見ないとわからないと思います。
下記のような流れが発生した場合,「排他処理」を行なっていないのでうまくいきません。
ユーザがアクセス
↓
サーバは新規IDを発行・・・(1)
↓
ユーザが素早くリロードボタンを押す・・・(2)
↓
サーバは(1)で発行したIDをDBに登録。新規レコードとして処理
↓
サーバは(2)に対し新規IDを発行・・・(3)
↓
サーバは(3)で発行したIDをDBに登録。新規レコードとして処理
↓
同一ユーザのアクセスが別IDで2件保管されてしまった
詳しくは,Webアプリにおけるセッションの実装と,排他処理を調べてみてください。
参考に試してみます。