葛藤プログラマの一日

2006-09-27

System.Transactions による分散トランザクション

.NETFramework2.0から追加された機能です。これがあれば、別々のDBサーバーの情報を1つのトランザクションで更新できるようになります。いままでは、1つのトランザクションで複数のDBサーバーの情報を更新しようとしたら、リンクサーバーとか使わなければいけませんでしたが、これでだいぶ楽になります。


テストしたソースはこんな感じ…

SqlConnection con1 = null;
SqlConnection con2 = null;
try {
con1 = new SqlConnection("connectionString");
SqlCommand cmd1 = con1.CreateCommand();
cmd1.CommandText = "commandText ";

con2 = new SqlConnection("connectionString");
SqlCommand cmd2 = con2.CreateCommand();
cmd2.CommandText = "commandText";

using ( TransactionScope ts = new TransactionScope() ) {
con2.Open();
cmd2.ExecuteNonQuery();

con1.Open();
cmd1.ExecuteNonQuery();

ts.Complete();
}
} finally {
if ( con1 != null )
con1.Close();
if ( con2 != null )
con2.Close();
}


おおっ、すばらしい。きちんとトランザクションが1つになっています。
今回は、commandText については、トランザクションを使用したストアドプロシージャを指定しました。System.Transactions を使うことで、ストアドプロシージャで指定したトランザクションは無視されるようです。今まで使っていたストアドプロシージャがそのまま使えるという点で、安心です。


最後に、環境整備ではまった点

1.クライアント、サーバーそれぞれに、MSDTCが必要!
WindowsXPは標準で入っているようですが、サーバーは別途インストールする必要があります。





  1. [Windows コンポーネントの追加と削除] をクリックします。
  2. [アプリケーション サーバー] ―. [ネットワーク DTC アクセスの有効化] を追加
  3. 分散トランザクション コーディネータ サービスを停止し、再び開始します。
  4. Microsoft SQL Server、および分散トランザクションと連携するその他のリソース マネージャ サービス (Microsoft メッセージ キューなど) をすべて停止し、再び開始します。
    (要は、再起動が良いでしょう(^^;)
2.「Distributed Transaction Coordinator」サービスが開始されていること!
これ、MSDTCのサービスです。


3.エラー別の対処法

【エラー内容】
"分散トランザクション マネージャ (MSDTC) のネットワーク アクセスは
無効になっています。 コンポーネント サービス管理ツールを使用して、
MSDTC のセキュリティ構成でネットワーク アクセスの DTC を有効にして
ください。"

http://support.microsoft.com/kb/839279

サーバー、クライアント、共に必要な設定。

「対処手順 」
(1) dcomcnfg.exe (または、[管理ツール] – [コンポーネントサービス ]を起動)

(2) コンポーネントサービスを展開して、[マイコンピュータ]のプロパティ を選択















(3) [MSDTC]タブ – [セキュリティ構成]ボタン を押す


















(4) Windows XP, Windows Server 2003R2 の場合


  1. 次の項目にチェックを付ける
    ・[セキュリティ設定] - [ネットワーク DTC アクセス]

  2. ・[セキュリティ設定] - [トランザクション マネージャ通信] - [受信を許可する]

  3. ・[セキュリティ設定] - [トランザクション マネージャ通信] - [送信を許可する]

  4. ・[セキュリティ設定] - [トランザクション マネージャ通信] - [認証を必要としない]


(5) Windows Server 2003 の場合
次の項目にチェックを付ける
・[セキュリティ設定] - [ネットワーク DTC アクセス]

・[セキュリティ設定] - [ネットワーク DTC アクセス] - [ネットワーク トランザクション]

・[セキュリティ設定] - [ネットワーク DTC アクセス] - [ネットワーク クライアント]

(6) OSに関係なく、
[DTC ログオン アカウント] – [アカウント] が「NT AUTHORITY\NeworkService」になっていることを確認。なっていなければ、アカウントを変更する。




【エラー内容】
"基本トランザクション マネージャとの通信が失敗しました。"
http://support.microsoft.com/kb/839279

「対処手順」

Windowsファイアーウォールの例外に以下の2つを追加
 「%windir%\system32\msdtc.exe」
 「[ポート番号] 135 、[TCP]」



【エラー内容】
"パートナー トランザクション マネージャにより、リモート トランザクションまたはネットワーク トランザクションのサポートが無効にされました。 (HRESULT からの例外: 0x8004D025) "
http://support.microsoft.com/?scid=kb;ja;817064&spid=3208&sid=62


DBサーバー側の設定変更

「対処手順」

  1. [Windows コンポーネントの追加と削除] をクリックします。
  2. [アプリケーション サーバー] ―. [ネットワーク DTC アクセスの有効化] を追加
  3. 分散トランザクション コーディネータ サービスを停止し、再び開始します。
  4. Microsoft SQL Server、および分散トランザクションと連携するその他のリソース マネージャ サービス (Microsoft メッセージ キューなど) をすべて停止し、再び開始します。

    最後のSQLServer再起動を忘れやすいので注意!ちなみに、WindowsServer2003R2の場合は、再起動が要りません。

2006-09-16

Windows Workflow Foundation (WF)

環境構築
インストールしたのは、(インストール順)
 Microsoft Pre-Release Software Microsoft .NET Framework 3.0 - Release Candidate
 Microsoft® Windows® Software Development Kit (Web) for RC 1 of Windows Vista and .NET Framework 3.0 Runtime Components
 Microsoft Visual Studio Code Name “Orcas” Community Technology Preview – Development Tools for .NET Framework 3.0
 Microsoft® Visual Studio® 2005 Extensions for Windows® Workflow Foundation Release Candidate 5

の4つです。もちろん、VirtualServer2005R2 にインストールです。


サンプル 
 Windows SDK .NET Framework (WinFX) 3.0 Samples RC1
 http://www.netfx3.com/ からダウンロード

を使っています。


 感想としては、WFを使うことのメリットは大きいでしょう。どちらかというと、WFの利点と言うよりも、ワークフローを導入するメリットになるかもしれませんが... 処理の流れがWFによってモデル化され、定型化されることによって、フローの可視性は相当あがります。
 今まではコード上で記述していたために、その流れが見づらくメンテナンスが難しいものでした。また、ドキュメントが残っていて流れが把握できたとしても、修正が重ねられて実際の流れとは異なっているということも良くあります。
 しかし、VisualStudioに組み込まれているWFを使うことによって、ドキュメントとプログラムが一体になっているため、そういった相違もなくなりますし、メンテナンスもし易くなります。メンテナンスがし易くなると言うことは、言い換えると流用しやすくなるということです。他のシステムで使っているワークフローを流用して、自分のシステム用にカスタマイズすることも出来るようになります。また、VisualStudioに統合されている効果も大きいです。ワークフローのソースをコピーすれば、他のシステムでも簡単に組み込むことが出来ます。
 WFに関することで言えば、フロー図の上にブレークポイントを設定できたり、アクティビティをカスタマイズして作成したり、という点に魅力を感じますが、もう少し使ってみて、WFの良さを探ってみたいと思います。 現状のWFの利用に難を言えば、各業務のためのサンプルとなるワークフローがあれば良かったのかなと思います。そうすると、導入しやすくなるのかな?と思います。けどそのうち、「ワークフローコレクション!」みたいな形でどこかのメーカーが売り出しそうですね(^^;


ちなみに、他のFoundationは、WPF(Windows Presentation Foundation)、WCF(Windows Communication Foundation) であるのに、WF という呼び名になっている理由は、ある団体と同じ呼び名になるから(プロレス団体ではなく、世界自然保護基金)だそうです。まぁ、どうでもいいですが、わざわざ変えなくても(^^;

2006-09-09

VirtualServer2005R2 を入手。早速使ってみました。
今回は、.NET Framework3.0 を試用するために入れてみたのですが、用途は他にも色々あると思いました。

VirtualServer2005R2の用途
 (1)システムのインストールテスト、動作テスト
 (2)あまり使われない複数の物理サーバーを、VirtualServer を使って一つの物理サーバーに集約
 (3)通常使うOSをVirtualServerにしてしまうとか(^^;...マシン交換時の移行が楽!?
考えたら他にもいろいろありそう。64bitサーバーであれば、メモリも多く積めるので、複数のVirtualServerを1台の物理サーバーで運用することも現実的になるかもしれません。

VirtualServer2005R2の新機能「差分ディスク」
ところで、VirtualPC2004 の時には無かった「差分ディスク」は、VirtualServer の用途をさらに広げています。

  • 「差分ディスク」は、「親ディスク」の内容と分離して状態を保存します。
  • 「親ディスク」の内容は変更されない
  • 複数の「差分ディスク」を作成して、その都度、使い分けることも可能
  • 後から「親ディスク」に「差分ディスク」を統合できる
と、なかなか良いところだらけです。一つ難を言えば、ディスク容量が結構必要になるということでしょうか?けど、それはVirturlPC2004のときの「復元ディスク」も同じだから、問題にはならないか...

例えば、「親ディスク」にOSをインストール。それ以降に行う作業を「差分ディスク」で行うようにすれば、複数の作業環境を別々の「差分ディスク」に保存することができ、切り替えて使用することができます。
VirtualPC2004の時にあった「復元ディスク」は、「親ディスク」に1:1であったため、複数の状態を保持することができませんでしたが、「差分ディスク」は「親ディスク」と1:nなので、状態を幾つでも保存できるところが、根本的に違います。

「差分ディスク」の使用で迷った点
 「差分ディスク」を作った後に、「親ディスク」を間違って書き換えられないように、マニュアルに書いてあるとおりに、vhdファイルをReadOnlyに変更。システムを起動すると、「書き込みできない」旨のエラー。色々試したところ、バーチャルマシンで「親ディスク」から「差分ディスク」を使うように変更しなければいけないのでした。これって大事なことなのに、マニュアルに書いてない(TT)

VirtualPC2004と比べて不便になった点
 バーチャルマシンを起動しているマシンとクリップボードが共有されない。これは、かなり不便!