12

少し前に、私は複数のユーザーが取引の作成を処理するために使用するアプリケーションを作成しました。私はしばらくの間開発を行っていません、そして私がユーザー間の並行性をどのように管理したかを思い出せません。そのため、デザインに関してアドバイスを求めています。

元のアプリケーションには、次の特徴がありました。

  • ユーザーごとに1つの重いクライアント。
  • 単一のデータベース。
  • 取引を挿入/更新/削除するための各ユーザーのデータベースへのアクセス。
  • 取引テーブルを反映するアプリケーションのグリッド。そのグリッドは、誰かが取引を変更するたびに更新されます。
  • WPFを使用しています。

これが私が疑問に思っていることです:

  1. 各アプリケーションのデータベースへの接続を気にする必要はないと考えるのは正しいですか?それぞれにシングルトンがあることを考えると、クライアントごとに1つの接続で問題はないと思います。

  2. アクセスの同時実行を防ぐにはどうすればよいですか?データを変更するときはロックする必要があると思いますが、その方法を覚えていません。

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

よろしくお願いします!

4

2 に答える 2

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

  2. 同時実行性を最大化するために、できるだけ遅くロックし、できるだけ早く解放します。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 ) 一貫性を管理するため、または DB ストアド プロシージャでそれらを処理するために連携する必要がある複数の db アクションがある場合。クエリは単純にしてください。次のヒントに従って、ロックの仕組みと、リソースの競合とデッドロックを減らす方法を理解してください: http://www.devx.com/gethelpon/10MinuteSolution/16488

  3. 他のデータベースはわかりませんが、SQL の場合は SQL Dependency を使用できます。http ://msdn.microsoft.com/en-us/library/a52dhwx7( v=vs.80 ).aspx を参照してください。

于 2011-01-13T15:34:50.193 に答える
3

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

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

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

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

トランザクションの範囲とその使用方法は、このプラットフォームには長すぎるトピックです。必要に応じて、このトピックに関する詳細情報を含むリンクをいくつか投稿できます。

自動更新の場合、ほとんどのデータベースは何らかのトリガー メカニズムをサポートしています。これは、データベースでの特定のアクション (たとえば、新しいレコードの作成やレコードの変更) で実行されるコードです。このトリガー内にコードを投稿できます。ただし、変更を受け取る側のアプリケーションに通知するだけで、トリガーからの変更を実際に "実行" する必要はありません (言語によって可能になる場合でも)。コードをトリガーしたアクションは、トリガー コードを終了するまで中断されることに注意してください。これは、必要に応じてリーン トリガーが最適であることを意味します。

于 2011-01-13T15:27:28.393 に答える