2

トランザクションに入れたい2つのlinq 2 SQLステートメントがあります(SQLサーバーはリモート、ファイアウォールの外側など)他のすべての通信は機能しますが、これら2つのステートメントをTransactionScope()でラップすると、MSDTCを構成する必要が生じ始めますやったのですが、ファイアウォールの問題があります (私が思うに) もっと簡単な方法はありますか?

私がやりたいことの基本はこれに要約されます:(両方ともフードの下に格納されたプロシージャです)

using (var transactionScope = new TransactionScope())
{
    Repository.DataContext.SubmitChanges();
    Repository.DataContext.spDoFinalStuff(tempID, ref finalId);
    transactionScope.Complete();
}

これを達成する最も簡単な方法は何ですか?

編集:
最初にこれを取得しました: トランザクション マネージャーは、リモート/ネットワーク トランザクションのサポートを無効にしました。(HRESULT からの例外: 0x8004D024) 私たちのサーバーでは、こちらの指示に従ってこれを修正しました。ただし、手順はWindows 7(私の開発ボックス)には適用されないようです。上記の回答に関する私のコメントを参照してください。

問題を修正した後(非win7ボックスで)、次のようになります:トランザクションはすでに暗黙的または明示的にコミットまたは中止されています(HRESULTからの例外:0x8004D00E)これは、一部のグーグルが示唆したファイアウォールの問題である可能性があります。

EDIT
リモートDBがSQL 2000であることを発見しました

4

4 に答える 4

0

トランザクション中に 1 つのデータベースのみを処理する必要がある場合は、単純に新しい を作成して開くことができますSqlConnection。これにより、を使用する必要がなくなりますTransactionScope。次に例を示します。

using (var con = new SqlConnection("constr"))
{
    con.Open();
    using (var tran = con.BeginTransaction())
    {
        using (var context = new YourDataContext(con))
        {
            // Do stuff
            context.SubmitChanges();
            int generatedId = /* get this id */
            // Do stuff with id

            context.SubmitChanges();
        }
    }
}

を使用するためRepository、背景にコンテキストを作成する必要がありますが、考え方は同じです。また、データベース トランザクションと接続を破棄することを忘れないでください。

于 2010-08-20T06:05:37.120 に答える
0

2 つの更新が 2 つの異なるデータベースに送信される場合、.net transactoinScope クラスは、トランザクションを調整するために MSDTC の助けを必要とします。SQL Server 2005 以降で、2 つの更新が同じデータベース内にある場合、MSDTC は関与しません。

MSDTC は com+ コンポーネント サービスで構成され、コンピューター名を選択し、プロパティを選択します。基本的には [認証なし] を選択する必要があります。

次のリンクが役立つかもしれません

http://support.microsoft.com/kb/306843

http://blogs.msdn.com/b/distributedservices/archive/2008/11/12/troubleshooting-msdtc-issues-with-the-dtcping-tool.aspx

于 2010-08-20T05:08:03.317 に答える
0

独自のトランザクション内でこれら 2 つの SP を実行する新しいストアド プロシージャをいつでも作成できますか? クイック&ダーティ...

于 2010-08-20T05:09:04.643 に答える
0

TransactionScopeSQLをいじりたくない場合は、これが最適です。私は、ファイアウォールを介してトランザクションを実行し、問題を抱えていることに慣れていません。発生している例外/エラーを投稿できますか?

本当に問題が発生している場合は、それらをラップするストアド プロシージャを作成し、ラップされたストアド プロシージャ内でトランザクションを実行できます。

于 2010-08-20T05:09:24.057 に答える