0

Linq-to-SQL を使用してデータを取得および更新する単純なアプリケーションがあります。

私の場合、リンク サーバーを使用して SQL Server 以外のデータ ソースからデータを読み取るDataContextというプロシージャがあります。GET_DATA読み取ったデータを使用して、SQL Server のいくつかのテーブルを更新します。

SQL Server 上のデータを更新するプロセスは、次のように (要約して) 行われます。

var db = new MyDBDataContext()
db.ExecuteCommand("Update table1 set field={0} where field={1}", value1, value2);

それは完全にうまく機能します。

ここで、問題: 1 つではなく 2 つのテーブルを更新するという新しい要件が発生したため、トランザクション制御を追加することにしました。

using (var db = new MyDBDataContext())
using (var tran = new TransactionScope())
{
    try
    {
        db.ExecuteCommand("Update table1 set field={0} where field={1}", value1, value2);
        db.ExecuteCommand("Update table3 set field={0} where field={1}", value1, value2);

        tran.Complete();
    }
    catch (Exception e)
    {
        tran.Dispose();
    }
}

もう一度問題なく動作しますが、データを更新した後 (プロセスが失敗したか成功したかに関係なく)、検索手順を実行しようとすると、次のエラーが発生します。

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

再び機能させる唯一の方法は、ASP.Net 開発サーバーを右クリックして閉じることです。何かを開いたままにしているようですが、dm_tran_session_transactionsDMV を確認したところ、開いているトランザクションが表示されません (メソッドにデバッグすると表示されますが、メソッドが完了すると、開いているトランザクションはありません)。

参考までに、dbcontextオブジェクトは選択と更新が異なり、追加しようとしましdb.SubmitChanges()たが、どちらも機能しませんでした。

どんなアドバイスも役に立ちます ありがとう

編集: 検索手順にはトランザクション制御が含まれておらず、単純な LINQ ステートメントによって呼び出されます。

var result = (from r in context.GET_DATA(parameter)
                          select new Object{
                             .....
                           }
              );
return result.ToList();
4

0 に答える 0