.NETエンタープライズ 対話型トランザクション処理の設計方法マイクロソフト コンサルティング本部 赤間 信幸 |
|
|
8.1.2 対話型トランザクション処理の典型的な設計方法
対話型トランザクション処理の典型的な設計方法は、大きく以下の3つに分けられる。
- 排他制御を行わず、運用により回避する。
- 業務排他制御機能を作り込む。
- 楽観同時実行制御を行う。
まずは各方法を概観して、考え方の違いを明らかにしよう。
A.排他制御を行わず、運用により回避する
特にマスタデータメンテナンスのような業務では、そもそも業務の実施を認められている担当者が数人しかいなかったり、行われる頻度も少なかったりすることが多い。このようなケースでは、アプリケーション側でガードをかけなくとも、担当者間で意識合わせを行ってから「同時に業務を実施する担当者を一人にする」ように運用対処すれば十分なことも多い。
このような場合には、単純に「後勝ち」ルールでデータを更新していけばよい。小規模な業務アプリケーションのマスタメンテナンス業務などでは、実装の容易性からこのような単純な後勝ちルールが採用されていることが多い※3。
※3 なおこのパターンは、Visual Studio .NETのDataAdapter構成ウィザードにおいて楽観同時実行制御を行わないように指定すると効率よく開発していくことができる。詳細は本章後半の「8.3.3 データ変更の検出精度」の「B.Visual Studio .NETによる更新クエリの作成」を参照して頂きたい。 |
とはいえ、この方法が通用するのは極めて小さなシステムに限られるだろう。システム的なガードが一切ないため、図8-4のようにデータを気付かず上書きしてしまうリスクが常に存在する。このため、ある一定以上の規模を持つシステムでは、後に述べる業務排他制御や楽観同時実行制御の機能を作り込むことが望ましい。
図8-4 排他制御を全く行わずに後勝ちルールでデータを更新する場合の動き |
B.業務排他制御機能を作り込む
これは、アプリケーション内部で独自に排他制御機能を用意するというものである。具体的には、データベース上に編集状態を保存するためのテーブルや列を追加し、ここに状態データ(編集中、予約済み、など)を記録する。業務処理を行う際には必ずこの状態データを確認するようにアプリケーションを作ることで、同時実行制御を行う(図8-5)。
図8-5 業務排他制御による対話型処理の動き |
実際のアプリケーションの挙動を図8-6に示す。この方式では、データ編集業務に入ろうとしたタイミングで当該データの編集状態がチェックされる。他のユーザが当該データを編集している場合には、警告メッセージを表示し、そのデータを操作させないようなロジックが作り込まれる。
図8-6 業務排他制御機能を利用した場合 |
この方法のメリットは、同一データを操作しているユーザを完全に1人に絞り込めることである。いったん編集モードに入ることができたユーザは、必ずそのデータを更新することができる。このため、以下のような特性を持った業務に適している。
-
チケット販売業務の商品選択〜精算完了のように、他のユーザによる横取りを完全に防ぎたい場合。
-
複数のユーザによって頻繁に変更されるデータを取り扱う業務の場合※4。
-
懸賞の当選番号確定業務のように、当該業務を起動できるユーザを1人にしたい場合※5。
※4 後述する楽観同時実行制御を利用して作り込んでしまうと、更新時に頻繁にエラー(更新衝突)が発生することになり、使い勝手の悪いアプリケーションになってしまう。 |
※5 このような場合には、データに対する排他ではなく、「業務」に対する排他制御が行われることになる。 |
半面この方法は、作り込みが面倒であること、データベーススキーマに修正が必要になることなどのデメリットがある。また詳細は後述するが、業務処理中にシステムエラーなどが発生した場合、フラグ情報の復旧が必要になることがある。このため、むやみに業務排他制御機能を作り込むのは避けた方がよい。業務要件を勘案し、次に述べる楽観同時実行制御で十分なものはそちらを利用するとよい。
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用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|