3

リンク サーバーを含むクエリがあります。クエリは SSMS で正常に実行され、Dapper を使用して C# でラップされた場合に実行されます

 var conn = GetOpenConnection(connInitializer);
 return query(conn);

期待される結果を生成します。ただし、コードをTransactionScope内に配置すると、

using (var trans = new TransactionScope())
{
     var conn = GetOpenConnection(connInitializer);
     var returnValue = query(conn);
     trans.Complete();
     return returnValue;
}

エラーが発生しました:

「リンク サーバー xxx の OLE DB プロバイダー "SQLNCLI11" が分散トランザクションを開始できなかったため、操作を実行できませんでした。」

これを機能させるには、SQL サーバーの構成を変更する必要がありますか?

4

1 に答える 1

3

明示的なトランザクション内でクエリを実行しているため、クエリがこれらの ACID プロパティに従う必要があります。データ ソース間のトランザクションを管理するには、Microsoft 分散トランザクション コーディネーター (MSDTC)を構成する必要があります。

クエリはもともとトランザクションの範囲外で機能していたので、単純な選択だと思います。その場合は、データ ソースごとに個別の接続を開き、必要なデータをアプリケーション オブジェクトにロードし、そこからマージして結果を生成することを検討してください。

それ以外の場合は、MSDTC 接続の問題をトラブルシューティングし、孤立したトランザクションのトランザクション キューを監視する準備をしてください。

于 2013-04-26T19:12:40.410 に答える