0

これがシナリオです。このテーブル Orders には、orders_id という auto_increment 列があります。テーブルは InnoDB ストレージ エンジンを使用します。(これは Orders テーブルに新しいレコードを挿入することではなく、重複した ID をプロセッサに送信しないようにする方法に関するものです)

orders_id       cust_id       name       address 
100              55           abc        123 street    
101              12           def        456 street   

次の注文では、次の利用可能な Orders_id を次のように計算します

$new_order_id_query = "SHOW TABLE STATUS LIKE ORDERS";
$result = tep_db_query($new_order_id_query);
$row = tep_db_fetch_array($result);
$new_order_id = $row['Auto_increment'];

次に、名前、住所、items_ordered などの他の情報を収集し、このように支払い処理業者に送信します

102              44           xyz         44 Street

問題は、まったく同時に 2 つ以上の注文がある場合にのみ、同じ orders_idを持つ 2 つの注文を支払い処理業者に送信してしまうことです。

問題は、重複した Orders_id を支払い処理業者に送信していないことを確認するにはどうすればよいですか?

last_insert_id() を使用するように提案されましたが、これは正しいか間違っている可能性がありますが、それを実装する方法がわかりません。

テーブルのロックについて読みました - それはトランザクション環境と InnoDB にとって良い考えですか? もしそうなら、どうすればそれを実装できますか?

4

4 に答える 4

1

あなたの最後の質問に対する私の答えで説明したように:

  1. 名前、住所、items_ordered などを収集します。

  2. 関連する詳細をテーブルに挿入ordersし、提供を省略しますid(MySQL が自動的に生成し、ロックを使用してその一意性を保証します)。

  3. idMySQL から生成された を要求して取得しますlast_insert_id(実際の関数呼び出しはドライバーによって異なります)。

  4. 支払い処理業者に送信します。

于 2012-10-15T16:27:50.923 に答える
0

実際の挿入が行われる前に支払い処理業者にIDを送信する必要があるため、IDを計算しています。

あなたが言及したすべてのテクニックは、データベース接続を開き、異なるHTTPリクエスト間でそれを開いたままにしておく必要があります(他のスクリプトインスタンスがそれを使用するのを防ぎます)ので、単一のデータベースセッションから利益を得ることができます。そうするための信頼できる方法はありません。

私は何年もの間osCommerceを使用していませんが(まだ存在していることに驚いています:)、基本的に2つの可能性があります。

  • 通常の方法で実際の注文を挿入しますが、保留中のタグを付けます。
  • 別のテーブルに予約注文を挿入します(おそらくあなたがデザインしたものです)。

正直なところ、支払いゲートウェイにリダイレクトする前に注文を保存する必要があると思います。セッションデータを信頼する場合、遅かれ早かれ注文を失うことになります。そして、あなたは支払われた注文を失うでしょう、それはもっと悪いことです。

于 2012-10-15T16:58:53.963 に答える
0

次のオーダー ID がどうなるかを計算する必要はありません。そのテーブルに行を挿入すると、自動インクリメントによって次の ID が自動的に作成されます。それが要点です。

auto_increment フィールドの値を指定せずに、他のすべての情報をテーブルに挿入する挿入を実行するだけです。

"INSERT INTO Orders (cust_id, name, address) VALUES (55, 'me', 'My House')"

挿入した行のオーダー ID を知りたい場合は、クエリ結果に対して last_insert_id() を呼び出すだけです。私が使用したものではないので、何が何であるかはわかりませんがtep_db、関数が必要だと思いますtep_db_insert_id()

于 2012-10-15T16:35:10.667 に答える
0

auto_increment 列は通常、コードで操作する必要はありません。auto_increment で定義された新しいレコード列を挿入すると、自動的にインクリメントされます。

last_insert_id は、接続コンテキスト内で自動的にインクリメントされるフィールドに割り当てられた値を取得するために使用されます。

問題のステートメントでそうする理由を提供しなかったため、あなたのケースではテーブルをロックすることはお勧めしません。

于 2012-10-15T16:19:56.743 に答える