想像してみてください。
A君が書き込んで確認画面が出た
(A君には101という番号が返された。)
↓
B君が書き込んで確認画面が出た
(B君には102という番号が返された。)
↓
B君のほうが先に確認済みボタンをクリックした。
(オートインクリメントなので101で登録された)
といったような具合になるとダメですよね。
では、
A君が書き込んで確認画面が出た
(A君には101という番号が返された。)
↓
B君が書き込んだら他の人が作業中と言う事で待たされた。
↓
B君は何度も書き込みボタンをクリックするが「他の人が作業中」と言う事で待たされた。
↓
A君が確認済みボタンをクリックした。
(オートインクリメントなので1で登録された)
↓
B君は何度もクリックを続けていたが、やっとの事で確認画面が返ってきた。
(B君には102という番号が返された。)
というように作業中はデータベースをロック(独占)すれば良いのだが、
上記のようにB君はいつ接続できるともしれないデータベースに何度も挑戦するような形になり
タイミングが悪ければ後から接続を試みたC君やD君に先を越されて
B君はいつまでも待たされる可能性がでてくる・・・。
上記のようにロックしてしまえば番号はズレたりしませんが
あまり賢い処理方法とは言えないですよね。
で、結局のところ、一旦仮に書き込んでしまうといった手順が必要になってくると言う事になります。
レコードに仮登録中フラグを立てておいて、確認が取れた時点でフラグを消去。
定期的に規定の時間を過ぎてもフラグが立ったままのレコードは強制削除。
仮登録日時と確認日時の2つを持たせるという手でも良いでしょう。
phpMyAdminで表示されているauto_incrementの値については
phpMyAdminでauto_incrementの値を表示している最中に
新しいレコードを書き込むSQLを平行して実行し、書き込めたかどうか、
そして、その後でauto_incrementの値はどうなっているのかを確認してみてください。
書き込めなかったとすればロックされている。
書き込めたとすればphpMyAdminでの表示はその時点だけのものだった。
という違いが理解できる事でしょう。
phpMyAdminでテーブルを選択し、ヘッダーメニューにある「操作」をクリックすると、テーブルオプションのauto_incrementの欄に、次に与えられる値が入っています。
そういう表示をしたいという質問です。(phpMyAdminのソースを見てもわからなかったので…。)
その後UPDATEを行えばどうでしょうか?
で登録されないのならロールバック。
レコードの数とAUTO_INCREMENTの値は関係ありません。
削除しても歯抜けになるだけです。
>それだけ余計な処理も増えるので、それが問題ですね。
既にご承知だと思いますが、今回の件に限らず、
機能を付けるために処理が増えるというのは致しかた無かったりしますので
(1)「処理コストの増大によるシステム負荷の増大」
(2)「機能の必要性」
の2つを天秤にかけて取捨選択するしかないですね。
自分で考えた以外に「もう少し簡潔に出来ないものか」っと思ってはてなを利用していますが、おっしゃるように致し方ない部分も発生しますよね。
とりあえず、出来る方法はみなさんが書いていただいたとおりなので、あとは本当に必要か否か検討します。
ありがとうございました。
こんな人たちが、日本のITを支えていると思ったら、怖いよ~
いまさらですが、参考になれば。
php前提で、ソースモロ書きですが適当に置き換えください。
//Numberフィールド(auto_increment)のID 最新番号を求める
//Auto_increment 次の自動インクリメント値
$sql_str = "SHOW TABLE STATUS";
$sql_ret = mysql_query($sql_str, $conn) or die('お前エラーだよ 2ch_inc.php' . mysql_error() );
$row = mysql_fetch_array($sql_ret);
$next_auto_increment = $row[Auto_increment];
もう遅かったかな?
>こんな人たちが、日本のITを支えていると思ったら、怖いよ~
大口叩く割には君も間違ってる。
SHOW TABLE STATUS で取得した値は確かに次の AUTO INCREMENT の値だが、それを「自分が使えるとは限らない」。
具体的には複数のコネクションが同時実行された場合にどのコネクションがその値を使うかは早い者勝ち。
トランザクションを使用しても無理。