2016-06-26 26 views
0

私はVisual Basic 2015とMySqlデータベースを使用してプログラムを作成していますが、以前この質問をしましたが、助けにはならなかった。2人のユーザーが同時に同じことをしようとします

は、例えば、私たちは、「ユーザー」という名前のテーブルがあります。

username | coins 
user1  |  3 
user2  |  5 

私はコイン値を変更したいのと、このコードが正常に動作しているが、このコードでは:1 - 私は、列の値を取得します。 2 - 値に単位を追加します。私はその値を列に入れます。したがって、問題は、データベースがオンラインで2つの異なるコンピュータがプログラムを実行し、同時に値を変更しようとするとどうなりますか?例えば、1人がuser1に2コインを、もう1人がuser1に4コインを払おうとしている。次に、コインの追加を同時にクリックします。最初のコンピュータは値を取得し、それは3です。2番目のコンピュータは値を取得し、3です。最初のコンピュータは2つのコイン(3 + 2 = 5)を追加し、5をコラムに入れます。今すぐ第2のコンピュータは4コイン(3 + 4 = 7)を追加し、7をコラムに入れます。だから私たちの列に7がありますが、3 + 2 + 4 = 9なので9があるはずです

ここに質問があります:列に値を直接追加する方法があるのですか、それを解決する別の方法がありますか問題?コメントで述べたように、あなたのコードの問題を無視

​​
+1

パラメータバインドを使用し、値とともに追加し、行ロックを使用します。あなたは上記のconcatナンセンスで問題にSQLインジェクションを追加しています。 – Drew

+0

...タイプ変換とSQLインジェクションと一般的な問題: 'D'Artagnan'というユーザ名でコードを試してください – Plutonix

+0

私はプログラミングの新人です。何を話しているのか分かりません。だからコードをお願いしますか?私はそれに取り組み、何かを学ぶことができます。 – Armin

答えて

1

、あなたは具体的には約求めている問題に対処するには、2つの方法があります。

まず、あなたはそれをそのまま続け、オプティミスティックな並行性を採用することができます。それは、各ユーザーがデータを編集している唯一のユーザーであると仮定して、それがそうであるように保存し、そうでない場合は例外をスローします。具体的には、レコードが保存されると、データベース内の現在の値がそのユーザーによって取得された元のデータと比較され、一致する場合にのみ新しい値が保存されます。もしそうでなければ、それはスローされたConcurrencyExceptionをキャッチして適切なことをすることはあなた次第です。これは、通常、データを再度取得し、ユーザーに再度編集を開始するか、現在のデータを既存の変更とマージするかのどちらかを要求します。

もう1つの方法は、特定の値を保存するのではなく、データベースの内容を単純に増やすことです。

UPDATE MyTable SET MyColumn = MyColumn + 1 WHERE ID = @ID 
関連する問題