0

二重リクエストの問題を修正しようとしています: ブラウザがサーバーに対して 2 つ以上の同一のリクエストを生成し、それらが異なるアプリ サーバーで処理された場合。

この場合、2 つのリクエストのうちの 1 つがヒットします。

Mysql::Error: Duplicate entry '...' 
for key 'index_purchases_on_site_id_and_order_number_and_email

その後、挿入リクエストと同じパラメーターを使用する代わりに既存のレコードを選択するレスキュー コードがあります。

select * from purchases where site_id = ? and order_number = ? and email = ?

しかし、データベースには何も見つかりません。

DB クエリ ログのフラグメント:

  SQL (1.3ms)   BEGIN
  ......
  Purchase Create (0.0ms)   Mysql::Error: Duplicate entry '1887-100264587-9z1CIIDsH2a21+AEEH2OR9LsndO3oIS4D4Am1U5XJ04=
' for key 'index_purchases_on_site_id_and_order_number_and_email': INSERT INTO `purchases` (`order_date`, `referrer`, `created_at`, `updated_at`, `encrypted_email`, `visitor_id`, `order_number`, `coupon_code`, `subtotal`, `customer_id`, `site_id`, `ip_address`) VALUES('2013-01-14 20:57:47', 'https://www.bonobos.com/b/checkout', '2013-01-14 20:57:47', '2013-01-14 20:57:47', '9z1CIIDsH2a21+AEEH2OR9LsndO3oIS4D4Am1U5XJ04=\n', 15813843, '100264587', '', 218.0, NULL, 1887, '12.106.186.6')
  Purchase Load (0.5ms)   SELECT * FROM `purchases` WHERE (order_number = '100264587' AND site_id = 1887 AND encrypted_email = '9z1CIIDsH2a21+AEEH2OR9LsndO3oIS4D4Am1U5XJ04=\n') LIMIT 1
  SQL (18.0ms)   ROLLBACK

これはどのように可能ですか?

4

0 に答える 0