2011-01-13 13 views
8

これまで、私は複数のユーザーが取引の作成を処理するために使用するアプリケーションを作成しました。 私はしばらく前から開発を行っていませんでしたが、ユーザー間の並行性をどのように管理したかは覚えていません。したがって、私はデザインの面でいくつかの助言を求めています。ユーザーごとデータベースアクセスアプリケーションの並行性を管理する最適な方法は何ですか?

  • つの重クライアント:

    元のアプリケーション

    は、次のような特徴を持っていました。
  • 単一のデータベース。
  • 各ユーザーが取引を挿入/更新/削除するためのデータベースへのアクセス。
  • 取引テーブルを反映するアプリケーション内のグリッド。グリッドは誰かが取引を変更するたびに更新されます。
  • 私はWPFを使用しています。

    1. は、私は、各アプリケーションのデータベースへの接続を気にしてはならないことを考えるに修正アム:ここ

は私が思ったんだけど何ですか?それぞれにシングルトンがあることを考慮すると、問題なくクライアントごとに1つの接続が期待されます。

  • アクセスの並行性を防ぐにはどうすればよいですか?私はデータを変更するときにロックするべきだと思いますが、方法は覚えていません。

  • データベースが更新されるたびに(たとえば、別のユーザーによって)自動的に更新されるようにグリッドを設定するにはどうすればよいですか?

  • ありがとうございました!

    +3

    何を参照してくださいデータベースの種類? –

    +0

    UIとして何を使用していますか? ASP.NET? WinForms? WPF? Silverlight? – Jeff

    +0

    私はWPFを使用しています。私は説明にそれを加えました。ありがとう – Goul

    答えて

    2
    1. 接続プールを使用して接続数を減らすことを検討してください。参照:http://msdn.microsoft.com/en-us/library/8xx3tyca.aspx

    2. 可能な限り遅くロックし、できるだけ早くリリースして同時性を最大化してください。一貫性を管理したり、DBストアドプロシージャで処理する必要がある複数のdbアクションがある場合は、TransactionScope(http://msdn.microsoft.com/en-us/library/system.transactions.transactionscope.aspxおよびhttp://blogs.msdn.com/b/dbrowne/archive/2010/05/21/using-new-transactionscope-considered-harmful.aspx参照)を使用できます。あなたの質問を簡単にしてください。次のヒントは、仕事をロックする方法を理解するに従って、どのようにリソースの競合やデッドロックを減らすために:http://www.devx.com/gethelpon/10MinuteSolution/16488

    3. 私は確信して他のDBではないけど、SQLのために、あなたはSQLの依存関係を使用することができ、http://msdn.microsoft.com/en-us/library/a52dhwx7(v=vs.80).aspx

    +0

    答えをありがとうジミー!それは、すべての私の質問に、私はいくつかの光を出す、記事のおかげで。 – Goul

    3

    通常並行処理は、ロックを使用してDBMSによって許可されます。ロックは、特定のリソースに排他ロックを許可し、他のアクセスを制限またはキューに入れることを許可するセマフォの一種です(コミットされていない読取りを使用する場合にのみ制限されます)。

    DBMSのmax_connections設定に触れる可能性のある高さに達していない間は、接続の数自体は問題にはなりません。そうしないと、メンテナンスやシャットダウンのために接続する際に問題が発生する可能性があります。

    DBMSは、通常、テーブルロック(MyISAM)またはローロック(InnoDB、その他ほとんどのDBMS)の概念を使用します。ロックのタイプによって、ロックのボリュームが決まります。テーブルロックは非常に高速ですが、通常は行レベルのロックより劣っていると考えられます。

    行レベルのロックはトランザクション内で発生します(暗黙的または明示的)。手動でトランザクションを開始するときは、トランザクションスコープを開始します。手動でトランザクションスコープを閉じるまで、変更はすべてこの正確なトランザクションの属性になります。変更はACID paradigmにも従います。

    トランザクションスコープとその使用方法は、このプラットフォームではあまりにも長いトピックです。必要に応じて、このトピックに関する詳細情報を掲載するリンクを投稿できます。

    自動更新の場合、ほとんどのデータベースは、データベースの特定のアクション(たとえば、新しいレコードの作成またはレコードの変更)で実行されるコードのような、ある種のトリガーメカニズムをサポートします。このトリガーの内部にコードを投稿することができます。ただし、受信したアプリケーションに変更内容を通知するだけで、トリガーからの変更は実際には「実行」しないようにしてください。コードをトリガーしたアクションは、トリガーコードが終了するまで中断されます。これは、まったく必要な場合は、傾きトリガが最適であることを意味します。

    +0

    助けてくれてありがとうTME、それは非常に有益であり、私によく並行性の仕組みに私によく答える。乾杯! – Goul

    関連する問題