「購入」を二回押すと注文も二件になる? 二重送信を防ぐ設計

反応がないともう一度押したくなる

ネットで注文ボタンを押した後、読み込み中の表示が長く続くと不安になります。「押せていなかったのかも」と考えて、もう一度押したくなるでしょう。しかし最初の操作がサーバーに届いている場合、再び押すと二つ目の処理が始まる可能性があります。画面から結果が見えないことと、処理が行われていないことは同じではありません。

注文の二重処理を防ぐ方法はサービスによって異なります。ボタンを一時的に押せなくする、同じ注文と分かる識別子を使う、注文履歴を確認させるなどの設計があります。どれか一つで全ての障害を防げるわけではありませんが、利用者の不安が二重操作につながりやすいことは、システム設計の重要な課題です。

画面とサーバーでは見えていることが違う

注文ボタンを押すと、端末はサーバーへ処理を要求し、その結果を受け取ろうとします。途中で通信が途切れた場合、端末には返事が来なくても、サーバー側では注文が成立していることがあります。反対に最初の要求そのものが届いていない場合もあります。利用者の画面だけでは、どちらなのか判断しにくいのです。

例えばレストランで注文票を渡した後、店員の返事が聞こえなかった場面に似ています。注文票をもう一枚渡すと、厨房へ二枚届くかもしれません。まず注文が通ったか確かめる方が、同じ言葉を繰り返すより安全です。通信の「無反応」と、操作の「無効」は区別しなければなりません。

同じ要求を繰り返しても結果が変わらない設計

コンピューターの世界には「べき等」という考え方があります。同じ操作を何度行っても、意図された最終的な効果が一回の場合と同じになる性質です。例えば「この設定をオンにする」は、同じ命令を繰り返してもオンの状態のままにできます。これに対し「残高から千円引く」は、何度も実行すれば引く回数だけ結果が変わりかねません。

ウェブ通信のHTTPでは、操作の種類によってべき等と定義されるものがあります。ただしその定義と、個々のサービスの注文処理で二重送信をどう防ぐかは区別が必要です。購入を行う仕組みが、自動的に全ての重複を防いでくれるとは限りません。

注文番号はなぜ役立つ

注文が成立したときに一意の番号を表示すれば、利用者はその処理を特定しやすくなります。履歴画面で番号を確認できれば、画面が止まっても「何かが起きたか」を調べる手掛かりになります。サービス側でも同じ要求に識別子を付けることで、重複処理を避ける設計を採用できます。

ただし番号が見つからないことだけで、絶対に処理がなかったとは言い切れません。画面表示やメールの遅れもあり得るためです。金銭が関わるときは利用履歴、確認メール、決済明細などを照合し、重複が疑われる場合は事業者に確認します。

受付済みと完了も別

通販では、注文の受け付けと決済の確定、商品の発送が別の段階で進むことがあります。「受付済み」と表示されても、商品が届いた証明ではありません。逆に決済通知が届いても、注文の状態と一致しているか確認する必要があります。一つの表示に全ての意味を持たせないことが大切です。

この考え方は授業の課題提出にも応用できます。提出ボタンを押したこと、サーバーが受け取ったこと、教師が確認したことは別です。操作が重要なら、受け付け番号や提出履歴のような確実な記録を残せる設計が役立ちます。

二重操作を避ける実践

反応が遅いときは、サービスの画面内に再送の案内があるか確認し、勝手に何度も購入を押さない方が安全です。通信を切り替えたりページを閉じたりする前に、状態表示を読みます。決済が絡む場合は、履歴を照合してから次の操作を決めます。

利用者だけが注意しても全て防げるわけではありません。サービス側には、ボタンの連打防止や重複要求の検知、操作結果を明確に表示する責任があります。大切な操作ほど、利用者の判断とシステム側の安全設計を組み合わせる必要があります。

確認メールが来ない場合

注文後にメールが届かなくても、迷惑メールの振り分けや配信の遅れなどで、注文が成立している可能性があります。メールが来ないことだけを理由に再注文すると、重複の危険があります。まず注文履歴や決済の状態を確認し、表示が分かりにくい場合は事業者へ問い合わせます。

反対に確認メールが届いたからといって、商品の発送や到着が保証されるわけではありません。注文受理、決済、発送、配送は別の状態です。見えていない段階を推測で補わず、表示の意味を確かめましょう。

開発者が考えるべき再試行

通信では要求を送った後に応答が失われることがあります。このとき同じ要求をもう一度送る仕組みは、失敗から回復するために役立ちます。しかし注文のような操作は、単に自動再送するだけでは安全とは言えません。一回の操作を一つの注文として扱える工夫が必要です。

たとえば要求ごとに重複を見分ける番号を付け、サーバー側で過去に処理したものか確認する設計が考えられます。ただし実装には保存期間や同時操作への対策などが必要で、番号を付けるだけで全て解決するわけではありません。

言葉の「確認」を二種類に分ける

「処理を受け付けた」という表示と、「処理の目的を達成した」という表示は違います。たとえば申し込みでは、書類の提出受付と審査の完了が別の日になる場合があります。システムの確認表示が何を意味するのか明確であれば、利用者は同じ操作を繰り返さずに済みます。

重要な手続きでは、画面に表示された番号と状態を残し、必要なら公式の履歴で確かめます。送信ボタンを押すことをゴールにせず、その後にどんな証拠が残るべきか考えることが、二重送信の予防になります。

一回と二回を紙で比べる

紙に「得点を五点増やす」と「得点を十点に設定する」と書き、同じ操作を二回行った結果を比べます。前者は得点が二回増え、後者は十点のままです。この違いから、同じ指示を繰り返してもよい操作と、そうでない操作があると分かります。

ボタンが一つに見えても、裏側の処理には性質の違いがあります。二重送信を防ぐ設計は「利用者が連打しないように願う」ことだけでは成立しません。曖昧な応答があっても同じ処理を一回として扱えるかという観点が重要です。

参考資料

関連記事

おすすめの記事