2016-11-17 10 views
2

私は、MySQLインベントリデータベースと対話するAPIを作成しています。Laravelの並行処理について

  • on-hand値を小さくし、製品のreserved価値を高める:私たちは、15次の方法でデータベースを更新し、製品を予約することができ、ユーザーを持っています。

inventory表は次のようになります。

id  int 
sku  varchar 
on-hand int 
reserved int 

問題がある:2人のユーザーが、同時にそれを更新しようとした場合、行の更新を処理するためにどのように?

iはTransactionsを使用していた考えていた最初のaproach:

<?php 
    function reserveStock() 
    { 
     $db->beginTransaction(); 

     // SELECT on-hand, reserved from inventory 

     // Update inventory values 

     $db->commit(); 

     return response()->json([ 'success' => 1, 'data' => $data ]) 
    } 

第二つpessimist lockingを用いた:

<?php 
    function reserveStock() 
    { 

     // SELECT on-hand, reserved from inventory with ->sharedLock() 

     // Update inventory values 

     return response()->json([ 'success' => 1, 'data' => $data ]) 
    } 

第三の一つはCEROの値とupdatingフィールドを作成することでした。更新する製品を選択するときに、その行で何かをする前にupdatingフィールドをチェックします。私がここに見る問題は、利用可能になるまで、updating != 0でループする必要があるということです。より多くの選択と更新が彼のaproachから来る。

最高の場合、どのような行動が起こりますか?私がここに書いたものよりも多くの選択肢があるかもしれません。

+1

2人のユーザーが同時に更新されないように対処する方法はありません。第2の更新は、第1の更新後にキューに入れられて実行されます。最後に更新したユーザーのデータが常に終了します。これはlaravelではなくデータベース設計に関連しています。各ユーザーが株式に行ったことを示す履歴表が必要です。後の計算は、合計または控除など、履歴テーブルを使用して必要なものです。 15人のユーザーで、2人が排他的な更新権限で「戦う」というチャンスはほとんどゼロです。より堅牢にする必要があります。 –

+0

私は実際に履歴表(kardex)を使ってデータベースを設計しましたが、ある時点でテーブルが何千もの行になり、値を再計算する必要があるためプロセスが遅くなると考えていました。 @ N.B。どう思いますか? – aerojun

+1

何十億もの行があるとすれば、それは少し問題になります。何千ものことではありません。数字を出すために常に表全体を調べる必要はなく、ある時点で在庫数を常に実体化し、そこから続けることができます。在庫を処理する場合は、在庫を追跡できるように履歴テーブルを用意する必要があります**。履歴表を使用すると、必要な数をいつでも知ることができます(10個の在庫がある場合、2個が売れ、1個が破損した場合は7個を販売します。 –

答えて

0

いずれのトランザクションも使用しないでください。

アップデートも使用しないでください。

あなたのデータベースをよく見直し、更新を取り除くために、代わりに挿入を使用してください。ピボットテーブルを作成して、ユーザーと製品間の接続に対応します。そして、最初の接続レコード(idが小さい方)のみを実際のレコードにします。

以上の説明は必要な場合は、ここではです:

が2、ユーザーが製品を得るためにレースを言います。彼らは両方ともピボットテーブルにレコードを作成しますが、ほとんど同時に、誰かがファーになるはずです。両者は非常に小さなトランザクションをコミットしてデータを保持します。そして、ピボットテーブルを読んで、誰が成功したかを確認します。最初のレコードは両方のレコードが同じになるため、使用中のブロックはありません(リース明示的に)。そうすれば、ある顧客は自分の記録を得て幸せになり、もう1人は別の製品を手に入れるために再申請します。

問題が解決しました。

関連する問題