Entity FrameworkでTransactionScopeを使用する際にMS-DTCへの昇格を防止する方法
Entity Frameworkを使用したプログラムで、TransactionScope内で2つ以上のクエリを実行した場合、何もしなければMS-DTCが使用されます。
しかし、単一のDBしか使用しないプログラムを作成していて、分散トランザクションが不要の場合、MS-DTCを使用するとオーバーヘッドが生じたり、デプロイするマシンの設定変更が必要になったりするため、不用意にMS-DTCへの昇格を防ぎたいことがあります。
そんな場合は以下のように、クエリを実行する前にオブジェクトコンテキストのDB接続を開くと、MS-DTCを使用せずにLCTで処理されるため、ローカルトランザクションと同様の仕組みで処理されます。
//選択して更新する場合 using (NORTHWNDEntities context = new NORTHWNDEntities()) { using(TransactionScope ts = new TransactionScope()) { //DB接続を開く(ココが今回のポイント) context.Connection.Open(); //選択(ProductIDが1のデータを取得) var query = from t in context.Products where t.ProductID == 1 select t; var product = query.First(); //更新(UnitsInStockを99に更新) product.UnitsInStock = 99; context.SaveChanges(); ts.Complete(); } }
【補足】DBがSQL Server 2008の場合は、上記と同様の条件下であれば、対応を入れなくてもMS-DTCへ昇格しません。