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_transactions
DMV を確認したところ、開いているトランザクションが表示されません (メソッドにデバッグすると表示されますが、メソッドが完了すると、開いているトランザクションはありません)。
参考までに、dbcontext
オブジェクトは選択と更新が異なり、追加しようとしましdb.SubmitChanges()
たが、どちらも機能しませんでした。
どんなアドバイスも役に立ちます ありがとう
編集: 検索手順にはトランザクション制御が含まれておらず、単純な LINQ ステートメントによって呼び出されます。
var result = (from r in context.GET_DATA(parameter)
select new Object{
.....
}
);
return result.ToList();