« Re: 続:.NET FrameworkのCultureと"々" | トップページ | [.NET] (続) フィードバック - WPF: テキストボックスに Maxlength の長さの日本語文字列が入力できない »

2008年11月18日 (火)

[.NET] Enlist=false でも、 DataContext は分散トランザクションの昇格をしちゃう

DB 接続文字列に Enlist=false と入っていると、 ADO.NET では、 分散トランザクションへの昇格が抑制されます。 そのため、 TransactionScope 内で DB 接続を開いても、 その接続は自動的にはトランザクションに参加しなくなります。
その状態でもトランザクションに参加させたい場合には、 開いた DB  接続に対して明示的に  conn.EnlistTransaction( Transaction.Current ) としてやる必要があります。 ( → [.NET] TransactionScope とユニットテスト )

その感覚でいたら、 ハマリました orz
LINQ to SQL の DataContext は、 SubmitChanges() の中で、 上で言う EnlistTransaction() をやってくれるみたいなんですねぇ。  Enlist=false を指定すれば、 勝手に昇格しなくなると思い込んでいたら、 実はちゃっかり昇格してました。

分散トランザクションというか、 TransactionScope を入れ子にできることは、 開発しているアプリケーションの要件としては不要であっても、 上記のリンク先に書いたように、 単体テストにはすごく役に立ちます。
ところがその反面、 分散トランザクションをサポートする MSDTC は、 ちゃんと設定されてちゃんと運用されている DNS サーバーを必要とするため、 クライアント側のアプリに採用するのは難しいのです。
そんなわけで、 TransactionScope は使って、 しかし結合テスト段階からは接続文字に  Enlist=false といれてやれば、 うっかり昇格させてしまうコードを書いていたらエラーになって発見できるはず… と思いこんでいて、 ハマリました orz
ユニットテストと結合テストを切り替えるたびに、 MSDTC のサービスを動かしたり無効にしたりしてしのいでますが、 めんどくさいです~ f(^^;

|

« Re: 続:.NET FrameworkのCultureと"々" | トップページ | [.NET] (続) フィードバック - WPF: テキストボックスに Maxlength の長さの日本語文字列が入力できない »

プログラミング」カテゴリの記事

コメント

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: [.NET] Enlist=false でも、 DataContext は分散トランザクションの昇格をしちゃう:

« Re: 続:.NET FrameworkのCultureと"々" | トップページ | [.NET] (続) フィードバック - WPF: テキストボックスに Maxlength の長さの日本語文字列が入力できない »