- PR -

複数ユーザ同時アクセスへの対応は?

1
投稿者投稿内容
KKJ
会議室デビュー日: 2002/08/13
投稿数: 17
お住まい・勤務地: 関東地方
投稿日時: 2003-01-06 10:41
お世話になっています。

ASP.NET + ADO.NET 環境において、複数アクセスに対処するには、どのような処理(仕様?)を構築するものなのでしょうか?


Webアプリケーションゆえ複数人からの同時アクセスの可能性は多々あると思います。一般的なC/Sシステムでも課題だと思いますが、DB自体の保護と、データ整合性を守りたいです。

ASPの時は、書籍を参考にしてファイルの書き込み時には「Application.Lock」メソッドを使いました。(これだけでは不十分だったのかもしれませんが・・・)

現在、ASP.NETにおいて、
DataAdapter + Connection + DataSet を経由させての DataGridサーバコントロール を画面に配置し、標準の編集ボタンによる更新処理が可能な状態にあるのですが、特別なプログラミングは付加していません。

特に、ショッピングサイト在庫数などシビアな要件を求められる場合どのようにされているのか気になります。

Sessionオブジェクトを利用して、データメンテ中を把握?
それともトランザクションを使う等、DB側におまかせ?
(AccessMDBは不可ですよね…?)

皆さんのご経験、アドバイスなど頂ければ幸いです。



【開発環境】
IDE : VS.NET Pro
言語 : VB.NET
OS : Win2000 Pro
DB : Access MDB(業務利用で無い為)

【実行環境】
OS : Win2000 Server

【参考にしている書籍】
「ADO.NET実践講座(日経BP)」
「ASP.NET実践講座(日経BP)」
「ASP.NET実践プログラミング(オーム社)」など
BONTA
会議室デビュー日: 2002/12/09
投稿数: 13
投稿日時: 2003-01-07 16:57
私は基本的に初心者ですが、

まず最初にフォーム認証なりの個々のユーザーの認証が必要です。
(恐らく認証はフォーム認証が一番簡単です)

その後にSessionオブジェクト等を使用する訳ですが、
Sessionオブジェクトはシビアなものに使用できない訳ではなく、
間違った使用の仕方をするとスケーラ・ビリティーが極端に低下するので
気をつけなければならないという代物です。

基本的にショッピング・カート等の値の維持は
当然Sessionオブジェクトを使用するのがセオリーです。

因みにASP.NETはSessionオブジェクトの値を他のサーバーのメモリー空間に保存したり、
SQLサーバーに格納したりする事も出来ます。

あとDBのデータ整合性ですが、
ADO.NETは当然、非接続なモデルであるので当たり前ですが、
その間にデータセットの値がDB側のデータセットの取得元の値と
変わっている事がありえます。

もし仮に表示の在庫が残り1個で2人の人でその商品を取り合った場合、
当然、後の人はあきらめねばなりません。
仮にほっといてもDB側でマイナス処理は出来ないでしょうが、
ここは常識的に考えたら”OleDbTransaction”等のクラスを使用し、
処理の結果をユーザーに返します。

しかし、これはどうしても設計上値の共有が必要である場合の例であり
いつもそうとは限りません。

可能な限りデータ・セットに必要最低限のデータだけを保持して運用するように設計します。

最後にAccessで”OleDbTransaction”が使用できるかどうかは知りませんが、
業務で使用するしないに関わらずAccessはASP.NETには相応しくないので、
VS.NETに付属のライセンス・フリーなSQLサーバーである”MSDE”を使用するのが最も最適な選択です。
biac
大ベテラン
会議室デビュー日: 2001/10/22
投稿数: 106
投稿日時: 2003-01-07 19:45
> データ整合性を守りたいです。

複数ユーザから同時にアクセスされたとき、データの不整合が起きないようにすることを、同時実行制御と言います。

いままでは、簡単に同時実行制御を実装するために、トランザクション中はデータベースをロックしたままにする、という手がよく使われてきました。 (ペシミスティック同時実行制御)
しかし、トランザクションがいつ終わるか分からないアプリケーション (Web アプリケーションもそうですね) では、待たされる時間がとても長くなってしまいます。 Web アプリケーションでは、ヘタをすると永遠に待たされることもありえるでしょう。

それに対して、トランザクション開始時にはデータベースにロックを掛けずにおいて、更新する瞬間だけロックする、というやり方も可能です。 データの整合性を保つためには、トランザクションを開始したときのデータをプログラム側で覚えておいて、更新直前に確認してやればいいのです。 (オプティミスティック同時実行制御)
このほうが、ユーザを待たせることがないという点で、優れているでしょう。 しかし、これを実装することは、いままではとても面倒だったのです。
ADO.NET は、オプティミスティック同時実行制御をサポートしてくれました。 まずは、オプティミスティック同時実行制御を検討してみることをお薦めします。

次の記事が参考になるかと思います。

http://www.microsoft.com/japan/msdn/library/ja/vbcon/html/vbtskPerformingOptimisticConcurrencyChecking.asp
> ADO.NET におけるデータ同時実行制御の概要

http://www.microsoft.com/japan/msdn/library/ja/cpguide/html/cpconoptimisticconcurrency.asp
> オプティミスティック同時実行制御
KKJ
会議室デビュー日: 2002/08/13
投稿数: 17
お住まい・勤務地: 関東地方
投稿日時: 2003-01-10 16:39
遅くなりましたが返信ありがとうございます。

BONTA様:

「OleDbTransaction」なるほど活用できそうですね。
後日、実際に試してみますね。
AccessMDBの件は了解しております。私の周囲にもっとMSDE技術者が増えれば良いのですが…。


biac様:

MSDNページまでも教えて頂きましてありがとうございました。
「オプティミスティック同時実行制御」初めて聞きました。(^-^;
つまり…UPDATE時に元のレコードと比較(タイムスタンプ等で)を行ってから、
実行をするorしない、の判断をするわけですね。
すごく実用性があると感じました。


Webアプリは、明確に見えない部分が多く(でも考慮すべきコト)設計に悩みます。
まだ実務経験無いのですが、はやく「これが主流」というスタイルを確立したいものです。




[ メッセージ編集済み 編集者: KKJ 編集日時 2003-01-10 16:40 ]
1

スキルアップ/キャリアアップ(JOB@IT)