- ベストアンサー
同時にボタンを押されたときにユニークなIDを安全に生成するには?
- 小説や漫画のIDを自動生成する際に、同時に登録ボタンを押された場合に重複することを避ける方法を教えてください。
- MySQLやApacheの挙動によっては、同時に処理が行われた場合に重複する可能性があるため、ユニークなIDを生成する方法が求められます。
- 同時に処理が行われても重複しないようなIDを安全に生成するためには、ロックやトランザクションを使用することが効果的です。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
そういう時のためにトランザクションと言うモノがあります。 MySQL なら InnoDB を使っていればトランザクションが使えるので、トランザクションを開始してから末番を検索し、+1して番号を作ってINSERTしコミットという流れにすれば大丈夫でしょう。 あとは ID カラムにユニーク制約を掛けておけば安心ですね。 ユニーク制約に引っ掛かってINSERTに失敗したら登録処理をやり直すようプログラミングしておけば完璧ですね。
その他の回答 (4)
- superside0
- ベストアンサー率64% (461/711)
単純なシリアル番号のIDということなら、 オートインクリメントにしておくとか、LAST_INSERT_IDを使うということで行けるんでしょうけど カテゴリを示す英字3文字+シリアル番号5桁の8桁の文字列を IDにしていて、 さらにカテゴリごとで連番にしたいということだと ちょっと面倒そうですね。 トランザクションを使うか、 IDをPHP側で作っているなら、テーブルロックしてから selectやinsertしたら、テーブルをアンロックってやって、 他からは、更新が終わるまでselectも待たせるようにするって感じになるかと。 (もしくは、テーブル設計をやり直すか)
お礼
早々のレスありがとうございます。 初めて実装しているのでなんとかなるだろう的なところがありました。 他の方の助言も合わせて見直してみます。
- satoklew
- ベストアンサー率22% (87/385)
MYSQLで作られた対象のテーブルの対象のカラムをユニーク制約をつければ良いと思います。データ挿入時に同じ番号を登録しようとしたら後から来た処理がDuplicate Errorとなり先の処理が勝ちになります。
お礼
早々のレスありがとうございます。 ユニーク設定をしてあるので確かにエラーになりそうです。 ただエラーだから再設定というのはなんか気持ち悪いですがいろいろな実装を試してみることにします。
- kawais070
- ベストアンサー率52% (2242/4283)
http://sairoutine.hatenablog.com/entry/2015/01/25/010557 上記の記事がわかりやすかな? LAST_INSERT_IDってのが面白いね。
お礼
早々のレスありがとうございます。 うまく使いこなせるか調べてみます!
- bardfish
- ベストアンサー率28% (5029/17766)
そういうときのために「排他処理」と言うものがあります。 私はOracleくらいしか経験がないのでMySQLがどうかはよくわかりませんが、レコード単位やテーブル単位で更新中(insert、update、delete)は他のセッションに更新させないということが可能です。 RDBMSの基本となる考え方ですのでマニュアルを見て調べてみてください。
お礼
早々のレスありがとうございます。 とても参考になります。 「排他処理」というのは知りませんでした。 調べてみます!
お礼
早々のレスありがとうございます。 トランザクションという単語は聞いたことがありますがよく知りませんでした。 これを機にちゃんと吸収したいと思います !