ソースデータベースから宛先データベースへのインポートプロセスを実行しています。これらのインポートを自動化された方法で頻繁に実行する必要があります。
ソースは宛先とは別のサーバーにあります。どちらもMSSQL2008です。Linq2SQLを使用してソースにアクセスし、カスタムデータレイヤーを使用して宛先にアクセスします。ソースDBを変更することはありません(ただし、現時点では読み取り専用として復元していません)。ただし、現在、transactionScope内でインポートを実行すると、別々のサーバー上の2つのDBにアクセスするため、トランザクション全体がDTCにプロモートされます。
ソースDBを読み取り専用にした場合でも、これは実行されますか?
このシナリオでDTCプロモーションを回避する方法に関する他の提案はありますか?
Remusの回答に対するフォローアップの質問(ありがとう):
フォローアップ#1:私のインポートルーチンは、ソースからレコードをインポートし、宛先に新しいレコードを作成するように構成されています。このような:
using(var scope = new TransactionScope())
{
// read some from source db using Linq2Sql
// transform source info
// update destination
// read some more from source db using Linq2Sql
// transform source info
// update destination
}
TransactionScopeのLinq2SqlビットをRequiresNewで囲むと言っていますか?または、私はソースでのトランザクションを本当に気にしないので、トランザクションにその接続が含まれるようにSuppressを使用してTransactionScopeで囲むことができますよね?
フォローアップ#2:
「同じデータベースに対しても、2番目の接続を開く」と言うと、これに関するいくつかのバリエーションを読みました。
- "second connection" ==まったく同じ接続文字列であっても、Connectionオブジェクトの2番目のインスタンス
- "2番目の接続"==別のResourceManagerへの接続およびSQL2005で、これ以前は上記の1と同じ意味ですが、SQL2008では、これは別のインスタンスを意味します(つまり、同じインスタンス上の2つのDBは昇格されません)