2017-12-24 15 views
0

N人のユーザーが領収書データを入力できるウェブアプリを作成しています。MySQL:selectを実行する前に必ず更新を実行する方法を教えてください。

スキャンしたレシートのセットがユーザに与えられているが、せいぜい2人のユーザが同じレシート上で動作するべきではありません。

すなわち、ユーザAとユーザBが受信-1上で動作することができるが、ユーザCがそれに働くことができない(別の領収書、領収書-2、ユーザCに割り当てられるべきであると言います)。

は、私が使用していますテーブル構造は、次のようになります。

[ユーザーレシート表]

+------------+--------------+ 
| user_id | receipt_id | 
+------------+--------------+ 
| 000000001 | R0000000000 | 
| 000000001 | R0000000001 | 
| 000000001 | R0000000002 | 
| 000000002 | R0000000000 | 
| 000000002 | R0000000001 | 
+------------+--------------+ 

[レシート表]

+-------------+--------+ 
| receipt_id | status | 
+-------------+--------+ 
| R0000000000 | 0 | 
| R0000000001 | 1 | 
| R0000000002 | 0 | 
| R0000000003 | 2 | 
+-------------+--------+ 

★ステータス0:1が割り当てられていないユーザ2に割り当てられている:2人のユーザ

    に割り当てステータス「2」
  1. に等しくないレシートテーブルから
  2. 選択領収領収書が割り当てられているユーザーと共にステップ1からフェッチされたレシートをセルします。
  3. 更新受信状況(> 1 0-または1-> 2)

これは私が上記の要件を達成するために計画方法です。

このアプローチの問題は、更新(STEP3)が実行される直前(STEP1)選択が実行される可能性があり得るということです。 この場合、ステータス2の領収書がフェッチされ、要件を満たさない別のユーザーに割り当てられます。

これが起こらないようにするにはどうすればよいですか?すべての目的のために

+0

ヒントを使用して行うことができます – Strawberry

答えて

2

transactionsを使用します。

START TRANSACTION 
    your SQL commands 
COMMIT 

取引のいずれか、すべての文が実行されたりしませまったく実行され、暗黙のうちに第二のアプローチよりも効率的である更新された行にロックを実行してみましょう

rを格納しないでください:

また、それがLOCK TABLE

関連する問題