2017-06-22 12 views
3

変更と選択のクエリをdbに同時に送信する(html、javascript、jspを使用して)Webサイトを作成しようとしています。 MySQLは明らかにそれを好まない(ConcurrectModificationExceptionどこでも)。dbとの同時実行文

SQL文を同時に受け取り、という名前のキューを作成し、それをいくつかのプロパティに基づいて並べ替え、次に互いに矛盾しないことを確認した後にキューを実行しますそれ以降の文は、テーブルを削除すると矛盾します)。

問題は、2つのステートメントが競合するかどうかを確認する方法がわかりません。私が覚えていたのは、テーブルが論理的にのようなものであるかどうかを確認して、ステートメントが実行された場合(重複テーブルで実行された場合)のように見えてから、エラーがスローされると、ステートメントは別のステートメントと競合します。しかし、これは何度もテーブルを複製しなければならないことを意味します。

したがって、2つのステートメントが競合していないかどうかを確認するにはどうすればよいですか?例えば

:これら二つを同時に受信し、その後、いくつかの方法で注文する場合は

String sql1 = "DELETE FROM users WHERE id=3625036"; 
String sql2 = "UPDATE users SET displayName=\\"FOO\\" WHERE id=3625036"; 

、その後、sql2sql1後に実行される可能性がありますし、それが例外をスローします。どのようにしてこの例で競合をチェックできますか?

+1

あなたが同時変更を許可する場合は、条件をレースにドアを開けます。学生は同時プログラミングの背景を持っていますか?あるいは、並行プログラミングを教えることについてのコースです(明らかにそうではないか、あなたはこの質問をしません)。そうでなければ、排他的アクセスを強制するデータベースが絶対に必要だと思います。 – Gilles

+0

@ Gillesなぜこのようなデータベースが必要なのかわかりません。 – ItamarG3

+1

複数のセッションが同時にクエリを作成している場合、生徒は競合条件を処理する必要があります。 'process_page(){open_session(); do_my_stuff(); close_session();書いてください。 } 'は教えるのが簡単です。レースフリーコードを書くことはますます難しくなります。データベースが並行セッションを許可している場合は、並行処理の問題(なぜ 'select(); update();?)が時間の半分を壊すのか?それがコースの目的なら、それは問題ありませんが、あなたの質問から、私はそれがポイントではないことを集めます。 – Gilles

答えて

1

mysql のドライバの問題は、mysqlドライバの更新を試してください。 別の回避策は、コードでテーブルレベルの同期を実装することです。

例:

class UserDAO{ 

public void upateUsers(String sql){ 
    synchronized(UserDAO.class){ 
    // do update operations 
    } 
} 

public void deleteUser(String sql){ 
    synchronized(UserDAO.class){ 
    // do delete operations 
    } 
} 

} 
+0

これはうまくいきました...ありがとう! – ItamarG3

3

MySQLのようにすべてのフルDBシステムは、通常のトランザクションとロックの制限内で、多数の同時操作をサポートします。スタックオーバーフローに関する質問をすることで、あなたの特定の問題を解決するのが最良です。

私は、キューイングの管理などのタスクを学生に任せてはいけないと思います。記述しているものの複雑さは重要であり、より重要なのはデータベースシステムのためです。彼らは、彼らが作ることができるよりはるかに優れたものを使うことができるときには、車輪を再発明しないように教えるべきです。そのような低レベルのDB構築を特に教えたくないのでない限り。