この記事でわかること
- 同時の入札は、画面ではなくデータの側で1件ずつ確定させる
- 「先着優先」は、何の時刻で先を測るかまで決めて初めて作れる
- 「そういう設計」と「試験で確かめた」は別に確かめる
オークションの終了間際に、2人が同じ瞬間に入札したら、システムはどちらを落札者にするのでしょうか。申し込みの締め切り、在庫の取り合い、予約枠の争奪など、「同時に起きること」を扱う業務システムでは、この答えを発注前に確かめておかないと、公開後に「2人とも自分が取ったと思っている」という事態が起こりえます。
私たちは、コレクターズアイテムのオークションを運営する企業様から受託したオークションサイトの新規開発(現在はリリース準備中)で、入札をデータベースの中の1か所で受け、その品物への入札を1件ずつ順に確定する作りにしました。
この記事では、その設計を根拠に、同時に起きる操作で結果を1つに決めるための考え方を書きます。
同時に起きることは、既製品の組み合わせでは保証しにくい
構想の段階(2026年5月26日)で、既製のブログ・ホームページ作成ソフトにオークション用の追加機能(プラグイン)を組み合わせる方法と、ゼロから作る方法を比べました。
既製の組み合わせについて私たちが評価したのは、「2人が同時に入札したとき、どちらが落札者かを、追加機能の水準では保証できない」という点です。入札の記録は、後で争いになったときに証拠になりえます。ここが曖昧なままでは事業として成り立たないと判断し、ゼロから作る理由の1つにしました。
既製品で十分な業務も多くあります。分かれ目は、平常時に動くかどうかではなく、いちばん厳しい場面(本件では終了間際の入札の集中)で、求める正しさを保証できるかどうかです。
同時の入札は、画面ではなくデータの側で1件ずつ確定させる
画面ごとに「今の最高額はいくらか」を判定すると、同じ瞬間に届いた2件の入札が、どちらも自分が最高額だと判定される恐れがあります。結果を1つに決めるには、判定する場所を1か所にまとめ、そこで順番を付ける必要があります。
本件の入札は、自動入札だけにしています。入札者は「ここまでなら出す」という上限額を預け、ほかの人の入札に応じて、システムが1段階ずつ上回る金額で代わりに入札します。
入札はすべて、データベースの中にある1つの処理で受けます。画面側では落札者を決めません。この処理は、同じ品物への入札を届いた順に1件ずつ扱い、前の入札の処理が終わるまで次の入札を待たせます。
- 1入札が届く
- 2同じ品物への入札を、届いた順に1件ずつ並べる
- 3順番が来たら、受付中か・金額が足りるかを確かめる
- 4価格・最高入札者・終了時刻を確定する
次の入札は、確定した結果を前提に同じ順で処理される
出典:オークションサイト 開発記録(2026年6月5日の打ち合わせで方式を確定)
1件の処理の中では、受付中かどうか(終了時刻を過ぎていないか)を順番が来た時点で確かめ、金額が足りているか、自分の入札で自分の価格をつり上げていないかを確かめます。そのうえで価格と最高入札者を決め、終了間際なら終了時刻を延ばし、ほかの人の自動入札との応酬もこの処理の中で決着させます。
同じ瞬間に届いた2件の入札も、同時には処理されず、必ずどちらかが先に確定します。後の入札は、先の入札で決まった価格を前提に判定されます。落札者が2人になることはない作りです。
「先着優先」は、何で先を測るかまで決める
自動入札では、2人がまったく同じ上限額を預けることがありえます。本件では、先に上限額を設定した人を優先すると、2026年6月5日のお客様との打ち合わせで決めました。
ただ、「先」を何で測るかが決まっていなければ、システムは判定できません。6月11日の設計レビューで、この点が定義されていないことを指摘し、どの時点の記録で前後を決めるか、それでも並んだ場合にどう決めるかを、詳細設計に書き込みました。
「先着順」「早い者勝ち」は、言葉では決まっているように見えて、作る段階で解釈が分かれやすいルールです。何をもって先とするかまで決めて、初めて同じ結果が出せます。
公正さのルールは、受け口の1か所に集める
順番の付け方だけでなく、公正さに関わるルールも同じ1か所に集めています。
- 1人の入札は「10秒に10回まで」に制限する。連打や機械による大量の送信を防ぐためで、通常の競り上げは妨げない水準として決めた(2026年10月1日に追加)
- 運営の管理者は、上限額など他の人に見えない情報を見られる立場のため、入札できないようにする
- 入札の記録は追記だけができる形にし、後から金額などを書き換えたり消したりできないようにする
ルールを画面ごとに書くと、どこか1つの抜けが全体の抜けになります。入札の受け口に集めておけば、どこから入札しても同じルールを通ります。
設計の段階で詰め、負荷の試験で確かめる
この作りは、設計書のレビューを重ねて固めました。
- 5月28日:社内で作った初版の設計書を見直し、「同時の入札はデータベースで順番を決める」という方針はあるものの、それをどこでどう動かすかが書かれていないと指摘した。自動入札どうしが反応し合い、処理が止まらなくなる恐れも同時に指摘した
- 6月5日:お客様との打ち合わせで、同時の入札はデータベースで1件ずつ順に処理すること、同じ上限額なら先着を優先すること、自動入札だけにすることを確定した
- 6月11日:2回の設計レビューを経て、受け付けの条件・断るときの理由の種類・途中で失敗したときの戻し方、終了時刻を過ぎた入札の扱い、「先」の定義を詳細設計に書き込んだ
一方で、同じ品物に100件の入札を同時に入れる負荷の試験は、公開前の判定項目に入れていますが、この記事を書いている時点ではまだ実施していません。設計の上で結果が1つに決まる作りにしていることと、実際の負荷のもとで想定どおりに動くことは、別に確かめる必要があります。
発注するときに役立つ3つのこと
「同時に操作したら、どちらが優先されるか」を聞く
見積もりや設計の説明を受けるときは、「2人が同時に操作したら、どちらが優先されますか。その判定はどこで行いますか」と聞いてみてください。判定の場所と順番の付け方が具体的に返ってくるかどうかで、設計の中で扱われているかが分かります。
「先着」「早い者勝ち」は、測り方まで決める
業務のルールに「先着」がある場合は、何の時刻で先を測るのか、同時刻ならどうするのかまで、発注の段階で決めておくと、作った後の解釈のずれを防げます。
設計と試験は、別々に確かめる
「そういう設計です」と「試験で確かめました」は別のことです。同時の操作が集中する業務では、本番に近い負荷をかけた試験を公開前に行うか、その結果をどう報告してもらえるかを確認してください。





