[.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 / Win8.1 ストアアプリ】 HttpClient で TLS 1.1 / 1.2 に対応するには(2018.06.17)
- 【VS2017 15.7pv2】 XAML のランタイム ツールに 「ヒートマップ」 が増えた(2018.03.28)
- 【.NET Core】 プロジェクトを作ると 「project.assets.json が見つかりません」 エラー(2018.02.10)
- 【#UWP】 ビットマップの表示色を変える (Win2D.uwp 経由で Direct2D を使う)(2017.08.23)
- 【#UWP】 CompactOverlay モード: Picture in Picture というか、「最前面に表示」するウィンドウを作る(2017.08.16)
この記事へのコメントは終了しました。
コメント