|
.NETエンタープライズWebアプリケーション 開発技術大全 ― エンタープライズWebアプリ開発に必要な知識と設計セオリー ― |
|
|
.NETエンタープライズWebアプリケーション 開発技術大全 Vol.5 トランザクション設計編 2005年3月22日発売! 本記事は、日経BPソフトプレス/マイクロソフトプレスより2005年3月22日発行の書籍『.NETエンタープライズWebアプリケーション開発技術大全 Vol.5 トランザクション設計編』より、同社の許可を得てその内容を転載したものです。 同書はマイクロソフトのコンサルタントが執筆した.NETシステム設計/構築のための技術解説書で、全5巻で構成されています。 シリーズ最終巻となるこの第5巻では、大規模システムにおけるデータベース処理には欠かすことのできないトランザクション処理について、詳細かつ実践的に、多くの図版を交えながら解説しています。 本記事の内容は、第1部の「第3章 接続型データアクセスと短時間トランザクション」からの転載です。トランザクション処理は短時間トランザクションと長時間トランザクションの2つに分類でき、本章では前者について解説しています。 短時間トランザクションの実装方法には、データベース、マニュアル、自動の3つがあり、ここでは各実装方法の具体的なサンプルコードを示しながら、そのメリット、デメリットを明確にします。そして最後にこれら3つを比較し、そのトレードオフについてまとめます。 実システムで必要となるトランザクション処理方式は、その業務内容に応じて多岐に渡るため、.NET Frameworkではいくつかの選択肢が用意されています。最適な方式を選択するために、本章の内容は非常に役立つはずです。 なお、書籍の詳細については本記事の最後に表記しています。 |
ご注意:本記事は、前挙の書籍の内容を改訂することなく、そのまま転載したものです。このため用字用語の統一ルールなどは@ITのそれとは一致しません。あらかじめご了承ください。 |
ここまでは、SQL Server内部での同時実行制御メカニズムについて解説してきた。しかし、実際のユーザアプリケーションでは、中間層であるビジネスロジック部からのトランザクション制御が必要になることがほとんどである。本章では、中間層からのトランザクション制御の基礎となる3種類の短時間トランザクション制御方式について、解説と比較を行う。
3.1 業務的なトランザクション制御
銀行口座の振り込み処理の例に限らず、業務アプリケーション処理ではトランザクションとして処理しなければならないものは極めて多い。こうしたトランザクション処理の多くは、業務内容に即した複雑な条件分岐を持っているため、図3-1のように中間層に存在するビジネスロジック部からの制御が求められる。
図3-1 中間層からのトランザクション制御の必要性 |
中間層からの業務的なトランザクション制御は、データベース内のみでのトランザクション制御とはさまざまな点で異なるが、中でも大きく違うのは、操作対象となるリソースが多岐に渡ることと、短時間で終了するとは限らないことである。
3.1.1 多岐のリソースにまたがるトランザクション制御の必要性
まず前者について考えてみよう。実際のアプリケーションではさまざまなリソース、例えばデータベースやファイル、キューなどへの一連の操作を、論理的に1つの不可分な処理(すなわちトランザクション処理)として実施する必要があることが多い(図3-2)。しかし、第2章で解説したようなデータベースのトランザクション制御だけでは、このようなトランザクション処理を実現できない。
図3-2 さまざまなリソースへのアクセスを行う業務アプリケーション |
3.1.2 長時間に渡るトランザクション制御の必要性
もう1つの大きな違いとして、業務的なトランザクション処理では、一連の処理内容が必ずしも短時間で終了できるとは限らない、という点が挙げられる。
典型的な例として、チケットの販売業務を考えてみよう(図3-3)。この業務では、チケットの確保からお金の受け取り、そして発券作業までを論理的に不可分なひとかたまりの作業として実施することが求められる。しかしお金の受け取りや画面操作は必然的に時間がかかる。このため、データベースのトランザクション制御の前提条件である、「短時間で処理が終わること」という条件を満たすことができない。したがって、このような長時間に渡るトランザクション制御は、データベースのトランザクション機能のみを用いて実装することができない。
図3-3 典型的な長時間トランザクション処理 |
これ以外にも、業務的なトランザクション処理が厄介な点はいろいろある。例えば図3-3ではチケットの印字発券がトランザクション内部に含まれているが、この発券処理は「ただ一度だけ(Exactly Once)」正しく行われなければならない。しかし発券処理は失敗時に容易に取り消せる処理ではなく、またプリンタの紙詰まりなどのデバイス故障も考慮すると、その処理フローはかなり複雑化する。
とはいえ、こうした業務トランザクション処理を一足飛びに解説することは大変である。また、業務的なトランザクション処理のほとんどは、短時間で完了するいくつかの短時間トランザクションを上手に組み合わせて実現することになる。そこで本書では、まずトランザクションを大きく以下の2つに分類し※1、これらを順番に解説していくこととする。
※1 それぞれショートトランザクション、ロングトランザクションと略して表現することもある。また、英語もShort-running Transaction、Long-running Transaction、あるいはLong-lived Transactionなどと称されることもある。 |
・ 短時間トランザクション処理(Short-term Transaction) | |
・ 短時間で終了させることが可能なトランザクション処理。 | |
・ データベースシステムやMS-DTC(後述)などのインフラが持つ同時実行制御機能を使うことにより、比較的容易に自動制御させることができる。 | |
・ 本章(「第3章 接続型データアクセスと短時間トランザクション」)と「第2部 自動トランザクション処理」にて解説する。 | |
・ 長時間トランザクション処理(Long-term Transaction) | |
・ 短時間で終了させることはできないが、論理的にはひとかたまりとして処理しなければならないトランザクション処理。代表的なものとしては、対話型処理やバッチ処理などが挙げられる。 | |
・ データベースシステムなどに自動制御させることができないため、設計を工夫して作り込みを行う必要がある。 | |
・ 「第8章 対話型トランザクション処理の設計方法」と「第9章 複雑なトランザクション制御」にて解説する。 |
さて、.NET Frameworkで短時間トランザクションを実装する場合、その方法には大きく分けて以下の3つがある。
- データベーストランザクション
- マニュアルトランザクション
- 自動トランザクション
これらにはそれぞれにメリットとデメリットがあり、適切な使い分けが必要となる。本章ではこれらの3つの実装方法を順番に整理し、最後にそのトレードオフをまとめることにする※2。
※2 なお、本書では基本的なADO.NETの使い方については解説しない。接続型データアクセスと非接続型データアクセスの違い、SqlConnectionオブジェクトやSqlCommandなどの基本的な使い方、コーディング方法などに関しては、本シリーズ第2巻「ASP.NET基礎編」の「第6章 ADO.NET基礎」を参照のこと。 |
INDEX | ||
.NETエンタープライズWebアプリケーション 開発技術大全 | ||
接続型データアクセスと短時間トランザクション | ||
1.業務的なトランザクション制御 | ||
2.データベーストランザクション | ||
3.マニュアルトランザクション | ||
4.自動トランザクション | ||
5.短時間トランザクション処理の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用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|