|
.NETエンタープライズWebアプリケーション 開発技術大全 ― エンタープライズWebアプリ開発に必要な知識と設計セオリー ― |
|
|
.NETエンタープライズWebアプリケーション 開発技術大全 Vol.5 トランザクション設計編 2005年3月22日発売! 本記事は、日経BPソフトプレス/マイクロソフトプレスより2005年3月22日発行の書籍『.NETエンタープライズWebアプリケーション開発技術大全 Vol.5 トランザクション設計編』より、同社の許可を得てその内容を転載したものです。 同書はマイクロソフトのコンサルタントが執筆した.NETシステム設計/構築のための技術解説書で、全5巻で構成されています。 シリーズ最終巻となるこの第5巻では、大規模システムにおけるデータベース処理には欠かすことのできないトランザクション処理について、詳細かつ実践的に多くの図版を交えながら、全体を3部に分けて解説しています。 本記事の内容は、「第3部 複雑なトランザクション制御」の「第8章 対話型トランザクション処理の設計方法」からの転載です。第1部および第2部では.NETで用意されているトランザクション機能についての解説ですが、第3部ではそれらの実践的な応用として、具体的な業務フローを軸にトランザクション機能の設計・実装方法を説明しています。 実際の業務では、長時間トランザクションをはじめとするさまざまなトランザクションがあり得ますが、それらは第2部までで解説されている短時間トランザクションの手法を組み合わせることにより解決できます。本章にはそのための設計パターンが数多く示されており、システム設計にすぐに役立てることができます。 なお、書籍の詳細については本記事の最後に表記しています。 |
ご注意:本記事は、前挙の書籍の内容を改訂することなく、そのまま転載したものです。このため用字用語の統一ルールなどは@ITのそれとは一致しません。あらかじめご了承ください。 |
本書の第1部と第2部では、データベース内部におけるトランザクション制御メカニズムであるロック機構や、アプリケーションからのトランザクション制御方式であるマニュアルトランザクションや自動トランザクションについて詳細な解説を行ってきた。これらは、我々が業務アプリケーションの開発をする際の基礎知識として深く正しく理解しておくべきものであるが、実際の業務アプリケーションでは、さらに複雑なトランザクション制御が求められることも多い。
本書の第3部では、業務的な視点から求められる複雑なトランザクション制御に関して解説を行う。なお、第3部で解説するトランザクション制御は、すべて第1部・第2部で解説した短時間トランザクションの組み合わせにより実現されているものである。このため、第1部・第2部の内容が理解できていれば決して難しいものではない。本書の第1部・第2部を必要に応じて読み返しつつ、第3部の学習を進めて頂きたい。
第8章 対話型トランザクション処理の設計方法
本章では、一連の処理の中にユーザ入出力処理を挟むような、対話型トランザクション処理の設計方法について解説する。
8.1 対話型トランザクション処理とは
8.1.1 長時間に渡る排他制御(トランザクション処理)の必要性
通常、業務アプリケーションには何らかの対話型処理が含まれているが、その中には対話処理の前後にまたがったトランザクション制御(すなわち同時実行制御や排他制御)を要求するものがある。2つほど例を挙げてみよう。
A.特急列車の指定席券の販売
例えば、窓口での特急列車の指定席券の販売業務を考えてみよう。実際の指定席券の販売では、以下のような手順で業務が進む。
-
一覧画面の中から、指定席券を購入したい列車や座席の種類(禁煙や喫煙、グリーン席など)、大人/子供区分、購入枚数などを選択し、座席を確保する。
-
購入金額が画面に表示されるので、お客様からお金を受け取る。
-
お金を確認したのち、指定席券を印刷・発券し、実際にお客様に手渡す。
このような業務では支払いの前後にまたがった排他制御を行い、指定席券が他の窓口から横取りされないようにしておく必要がある(図8-1)。
図8-1 指定席券の販売業務 |
B.商品マスタデータの管理業務
別の例として、商品マスタデータのメンテナンス業務を、たまたまユーザAとBとが別端末から同時に行った場合を考えてみよう(図8-2)。ユーザAが商品Xの売価を10%引きに変更したにもかかわらず、その変更に気付かずにユーザBがその売価をさらに10%引きにしてしまったとすると、商品金額は19%引きとなってしまう。このような処理でも、やはりユーザAとユーザBの業務の間で、何らかの排他制御、すなわちトランザクション制御を行わなければならない。
図8-2 商品マスタデータの管理業務 |
ここに挙げた2つの業務は、どちらも比較的長時間(数秒から数十秒)に渡る排他制御を必要としている。このようなトランザクション処理のことを、一般に長時間トランザクション処理(Long-term Transaction Processing)と呼ぶ※1。これに対して、高々数秒程度で完了するようなトランザクション処理のことを、短時間トランザクション処理(Short-term Transcation Processing)と呼ぶ。
※1 「長時間」というキーワードに惑わされないようにして頂きたい。長時間というキーワードからは「数十分」「数時間」といった時間を想像しがちだが、オンライントランザクション処理の世界では、「数秒」以上であれば長時間である。 |
一般に、長時間に渡る排他制御は、第2部までで解説してきた3つのトランザクション制御方式(データベース、マニュアル、自動)のみに頼った形で実装することができない。例えば図8-2に示した2人の処理の排他制御を行うために、図8-3のようにデータベース上にロックをかけ続けてみよう。するとユーザBの処理は、ユーザAが完全に処理を終了するまでの間、ブロッキングされてしまう。データ更新の不整合は発生しないものの、クライアントではサーバからの無応答状態が長時間続くことになり、UIが固まったり、通信のタイムアウトが発生したりする。また、サーバ側ではブロック中も各種のリソース(メモリやスレッドなど)が消費され続けるため、スケーラビリティが悪化する。
図8-3 データベースの排他制御機能(ロック機構)をそのまま利用した長時間トランザクション制御の問題 |
この例から分かるように、第2部までで解説してきた3つのトランザクション制御方式は、いずれも短時間トランザクション処理の制御でしか利用できない。ここで採り上げたような長時間を要するトランザクション処理(排他制御)を行うためには、何らかの設計上の工夫が必要になる。
実際の業務アプリケーションにおいて、長時間に渡るトランザクション処理を求められる典型的な業務としては、以下のようなものが挙げられる※2。
※2 これ以外に、大量の帳票印刷処理やワークフロー型アプリケーションなども挙げられる。 |
・ 対話型処理 | |
・ 対話処理をトランザクションの一部として含む場合には、必然的に時間がかかる。 | |
・ バッチ処理 | |
・ 月次の利息計算処理のような多数のレコードに対する一括処理は、必然的に時間がかかる。 | |
・ (非同期型の)システム間連携処理 | |
・ システム間連携処理では、処理結果を受け取るまでに長時間を要するものも多い。 |
こうした長時間トランザクション処理の設計は、実際にはケースバイケースでの検討が求められることが多く、解決方法も一概に言えるものではない。ただ、いずれの場合も、長時間に渡る処理をいくつかの短時間トランザクション処理(すなわちデータベースなどのトランザクション制御機構を利用する物理的なトランザクション処理)に分解・分割し、それらを組み合わせて、論理的なトランザクションを構成することにより解決する。
本章では、まずこれらの長時間トランザクション処理の中でも最も重要な、対話型トランザクション処理の設計方法について解説する。他の処理については「第9章 複雑なトランザクション制御」で取り扱う。
INDEX | ||
.NETエンタープライズWebアプリケーション 開発技術大全 | ||
対話型トランザクション処理の設計方法 | ||
1.長時間に渡る排他制御(トランザクション処理)の必要性 | ||
2.対話型トランザクション処理の典型的な設計方法 | ||
3.楽観同時実行制御を行う | ||
「.NETエンタープライズWebアプリケーション開発技術大全」 |
- 第2回 簡潔なコーディングのために (2017/7/26)
ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている - 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう - 第1回 明瞭なコーディングのために (2017/7/19)
C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える - Presentation Translator (2017/7/18)
Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|