1

シナリオ:複数(おそらく2から20)のサーバーアプリケーションがADO.NETを使用して単一のデータベースを使用できるようにしたい。個々のアプリケーションがデータベース内のレコードセットの所有権を取得し、それらをDataSetsのメモリに(速度のために)保持し、データに対するクライアントリクエストに応答し、更新を実行し、他のアプリケーションが所有権までそれらのレコードを更新できないようにする必要があります放棄されました。

ADO.NETは初めてですが、データアダプター(ADO.NET切断レイヤー)を使用したトランザクションを使用すると、これが可能になるはずです。

質問パート1:これを試す正しい方法ですか?

質問パート2:それが正しい方法である場合、この種のアプローチのチュートリアルまたは例(C#)を誰かに教えてもらえますか?

質問パート3:個々のレコードの所有権を取得して個別にリリースできるようにする場合は、レコードごとに個別のトランザクションが必要ですか、さらに、各レコードを保持するために個別のDataAdapterとDataSetが必要ですか?それを行うためのより良い方法は?各アプリケーションは、数千のレコードの所有権を同時に保持する可能性があります。

4

2 に答える 2

1
  • トランザクションを開いたままにしておくことをどのくらい考えていましたか?
  • 何人の同時ユーザーをサポートしますか?

これらはあなたがあなた自身に尋ねる必要がある2つの質問です。前者の答えが「長い時間」であり、後者の答えが「多く」である場合、アプローチはおそらく問題にぶつかるでしょう。

したがって、質問1に対する私の答えは、「いいえ、おそらく正しいアプローチではありません」です。

トランザクションロックアプローチを採用すると、スケーラビリティと応答時間が制限されます。データベースエラーが発生する可能性もあります。たとえば、SQL Server(SQL Serverを使用していると仮定)は、ロックに非常に貪欲であり、要求/期待よりも多くのリソースをロックする可能性があります。アプリケーションは、「所有する」レコードをロックするためにいくつかの行レベルのロックを要求できますが、SQLServerはそれらの行ロックをテーブルロックにエスカレートできます。これはブロックされ、タイムアウトまたはデッドロックが発生する可能性があります。

あなたが述べたように、要件を満たすための最良の方法は、ロックマネージャー/レコードチェックアウトシステムを作成することだと思います。マーティンファウラーはこれを悲観的なオフラインロックと呼んでいます。

アップデート

SQL Server 2008を使用している場合は、テーブルレベルでロックエスカレーションの動作を設定できます。

ALTER TABLE T1 SET (LOCK_ESCALATION = DISABLE);

これにより、「ほとんどの」状況でロックのエスカレーションが無効になり、役立つ場合があります。

于 2010-06-18T06:17:59.497 に答える
0

実際には、トランザクションのサポートとともに、同時実行制御が必要です。

Transactionデータベースに対して複数の操作を実行する場合にのみ、問題が発生します。接続が解放されるとすぐに、トランザクションは適用されなくなります。

concurrency同じデータに対して複数の更新を処理できます。2つ以上のクライアントが同じデータセットを保持していて、別のクライアントがデータを更新した後に1つがデータの読み取り/書き込みを行う必要がある場合、同時実行により、保持する更新セットと無視する更新セットを決定できます。並行性の概念について言及することは、この記事の範囲を超えています。詳細については、この記事を確認してください。

于 2010-06-18T06:24:51.007 に答える