データベースアクセスアプリケーションで並行性を管理する最良の方法は何ですか?

StackOverflow https://stackoverflow.com/questions/4681280

質問

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

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

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

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

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

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

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

よろしくお願いします!

役に立ちましたか?

解決

  1. 接続プーリングを活用して、接続の#を減らすことを検討してください。見る: http://msdn.microsoft.com/en-us/library/8xx3tyca.aspx

  2. できるだけ遅くロックし、同時性を最大化するためにできるだけ早く解放します。 Transactionscopeを使用できます(参照: http://msdn.microsoft.com/en-us/library/system.transactions.transactionscope.aspxhttp://blogs.msdn.com/b/dbrowne/archive/2010/05/21/using-new-transactionscope-considered-harmful.aspx)一貫性を管理するために一緒に行く必要がある複数のDBアクションがある場合、またはDB保存Procでそれらを処理する必要がある場合。クエリをシンプルに保ちます。次のヒントに従って、ロック作業とリソースの競合とデッドロックを減らす方法を理解してください。 http://www.devx.com/gethelpon/10minutesolution/16488

  3. 他のDBはわかりませんが、SQLではSQL依存関係を使用できます。 http://msdn.microsoft.com/en-us/library/a52dhwx7(v=vs.80).aspx

他のヒント

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

接続の数自体は、DBMSのMAX_Connections設定に触れる可能性のある高さに達していない間、問題を引き起こしません。それ以外の場合は、メンテナンスの目的やシャットダウンのために問題が発生する可能性があります。

DBMSは通常、テーブルロック(Myisam)またはRow Locks(Innodb、他のほとんどのDBMS)のいずれかの概念を使用します。ロックのタイプがロックのボリュームを決定します。テーブルロックは非常に高速になる可能性がありますが、通常は行レベルのロックより劣ると見なされます。

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

トランザクションの範囲とそれの使用方法は、このプラットフォームにとって長すぎるトピックです。必要に応じて、このトピックに関するより多くの情報を伝えるリンクを投稿できます。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top