.NET TransactionScopeの落とし穴

using句を利用してTransactionScopeを使うというマイクロソフト推奨の方式を利用して更新処理を実装している訳だが、Completeメソッドを呼んでいないにも関わらずデータがCommitされているという現象に直面した。

原因としては、ある時期を境に発生しはじめた分散トランザクションエラーに対応するため、オラクルの接続文字列属性のEnlistをdynamicに変更した事によりTransactionScopeを使っていてもコネクションがトランザクションに自動では登録されなくなり、結果Completeを行っていなくてもusing句の終了時にCommitが行われていたらしい。
とりあえず対応としてコネクションオブジェクト作成時に併せてDbConnection.EnlistTransactionを利用してトランザクションに参加させておいた。
自前のフレームワーク側にDBコネクション用のファクトリクラスが無けりゃ対応箇所の多さに泣く所だった。
昔ボスが言っていた、標準で用意されているようなクラスはとりあえずラップして使え、という言葉の意味が少しわかった。