• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:同時にボタンを押されたとき)

同時にボタンを押されたときにユニークなIDを安全に生成するには?

このQ&Aのポイント
  • 小説や漫画のIDを自動生成する際に、同時に登録ボタンを押された場合に重複することを避ける方法を教えてください。
  • MySQLやApacheの挙動によっては、同時に処理が行われた場合に重複する可能性があるため、ユニークなIDを生成する方法が求められます。
  • 同時に処理が行われても重複しないようなIDを安全に生成するためには、ロックやトランザクションを使用することが効果的です。

質問者が選んだベストアンサー

  • ベストアンサー
  • t_ohta
  • ベストアンサー率38% (5238/13705)
回答No.4

そういう時のためにトランザクションと言うモノがあります。 MySQL なら InnoDB を使っていればトランザクションが使えるので、トランザクションを開始してから末番を検索し、+1して番号を作ってINSERTしコミットという流れにすれば大丈夫でしょう。 あとは ID カラムにユニーク制約を掛けておけば安心ですね。 ユニーク制約に引っ掛かってINSERTに失敗したら登録処理をやり直すようプログラミングしておけば完璧ですね。

TeijigoTeatime
質問者

お礼

早々のレスありがとうございます。 トランザクションという単語は聞いたことがありますがよく知りませんでした。 これを機にちゃんと吸収したいと思います !

その他の回答 (4)

回答No.5

単純なシリアル番号のIDということなら、 オートインクリメントにしておくとか、LAST_INSERT_IDを使うということで行けるんでしょうけど カテゴリを示す英字3文字+シリアル番号5桁の8桁の文字列を IDにしていて、 さらにカテゴリごとで連番にしたいということだと  ちょっと面倒そうですね。 トランザクションを使うか、 IDをPHP側で作っているなら、テーブルロックしてから selectやinsertしたら、テーブルをアンロックってやって、 他からは、更新が終わるまでselectも待たせるようにするって感じになるかと。 (もしくは、テーブル設計をやり直すか)

TeijigoTeatime
質問者

お礼

早々のレスありがとうございます。 初めて実装しているのでなんとかなるだろう的なところがありました。 他の方の助言も合わせて見直してみます。

  • satoklew
  • ベストアンサー率22% (87/385)
回答No.3

MYSQLで作られた対象のテーブルの対象のカラムをユニーク制約をつければ良いと思います。データ挿入時に同じ番号を登録しようとしたら後から来た処理がDuplicate Errorとなり先の処理が勝ちになります。

TeijigoTeatime
質問者

お礼

早々のレスありがとうございます。 ユニーク設定をしてあるので確かにエラーになりそうです。 ただエラーだから再設定というのはなんか気持ち悪いですがいろいろな実装を試してみることにします。

  • kawais070
  • ベストアンサー率52% (2242/4283)
回答No.2

http://sairoutine.hatenablog.com/entry/2015/01/25/010557 上記の記事がわかりやすかな? LAST_INSERT_IDってのが面白いね。

TeijigoTeatime
質問者

お礼

早々のレスありがとうございます。 うまく使いこなせるか調べてみます!

  • bardfish
  • ベストアンサー率28% (5029/17766)
回答No.1

そういうときのために「排他処理」と言うものがあります。 私はOracleくらいしか経験がないのでMySQLがどうかはよくわかりませんが、レコード単位やテーブル単位で更新中(insert、update、delete)は他のセッションに更新させないということが可能です。 RDBMSの基本となる考え方ですのでマニュアルを見て調べてみてください。

TeijigoTeatime
質問者

お礼

早々のレスありがとうございます。 とても参考になります。 「排他処理」というのは知りませんでした。 調べてみます!

関連するQ&A