5

Sql 2000 データベースに対する Linq-to-Sql アクションの単純なトランザクションを設定しようとしています。TransactionScope を使用すると、次のようになります。

using (TransactionScope transaction = new TransactionScope())
{
    try
        {
        Store.DBDataContext dc = new Store.DBDataContext();
        Store.Product product = GetProduct("foo");
        dc.InsertOnSubmit(product);
        dc.SubmitChanges();
        transaction.Complete();
    }
    catch (Exception ex)
    {                
        throw ex;
    }
}

ただし、次のエラーが発生し続けます。

パートナー トランザクション マネージャーは、リモート/ネットワーク トランザクションのサポートを無効にしました。(HRESULT からの例外: 0x8004D025)

しかし、従来のトランザクションを使用してトランザクションをセットアップすると、問題なく動作します。したがって、これは正常に機能します:

Store.DBDataContext dc = new Store.DBDataContext();
try
{
    dc.Connection.Open();
    dc.Transaction = dc.Connection.BeginTransaction();
    Store.Product product = GetProduct("foo");
    dc.InsertOnSubmit(product);
    dc.SubmitChanges(); 
    dc.Transaction.Commit();
}
catch (Exception ex)
{
    dc.Transaction.Rollback();
    throw ex;
}
finally
{
    dc.Connection.Close();      
    dc.Transaction = null;
}

TransactionScope が、私の 2 番目の実装とは裏で何か違うことをしているのだろうかと思っています。そうでない場合、TransactionScope を使用しないと何が失われますか? また、エラーの原因に関するガイダンスも役立ちます。MSDTC が SQL サーバーとクライアント マシンの両方で実行されていることを確認しました。

4

5 に答える 5

6

ここを見てください:

System.TransactionsおよびMicrosoftSQLServer2000との高速トランザクション http://blogs.msdn.com/florinlazar/archive/2005/09/29/475546.aspx

そしてここに: http:
//forums.microsoft.com/MSDN/ShowPost.aspx?PostID = 230390 &SiteID = 1

まず、「DistributeTransactionCoordinator」サービスがデータベースサーバーコンピューターとクライアントコンピューターの両方で実行されていることを確認します
。1。「AdministrativeTools>Services」に移動します
。2。「DistributeTransactionCoordinator」サービスが実行されていない場合はオンにします。

実行中で、クライアントアプリケーションがデータベースサーバーと同じコンピューター上にない場合は、データベースサーバーを実行しているコンピューター上で
1.[管理ツール]>[コンポーネントサービス]に移動します
。2。左側のナビゲーションツリーで、[コンポーネントサービス]>[コンピューター]に移動します。 > [マイコンピュータ](一部のノードは展開するのに時間がかかるため、ダブルクリックして待つ必要がある場合があります)
3. [マイコンピュータ]を右クリックし、[プロパティ]を
選択します4.[MSDTC]タブを選択します
5.[セキュリティ構成]をクリックします
6 。「ネットワークDTCアクセス」、「リモートクライアントを許可」、「インバウンド/アウトバウンドを許可」、「TIPを有効にする」を必ずチェックしてください(一部のオプションは必要ない場合がありますが、構成を取得してみてください)
7。サービスが再起動します
8.それでも機能しない場合は、サーバーを再起動する必要があるかもしれません(これは以前私を夢中にさせたものです)

クライアントコンピューターで、上記と同じ手順を使用して[セキュリティ構成]設定を開き、[ネットワークDTCアクセス]、[受信/送信を許可]オプションをオンにし、必要に応じてサービスとコンピューターを再起動します。

SQL Serverサービスマネージャーで、[サービス]ドロップダウンをクリックし、[トランザクションコーディネーターの配布]を選択します。サーバーコンピューターでも実行されている必要があります。

于 2008-11-26T15:24:44.553 に答える
3

Keith Sirmons が指摘してくれた Florin Lazar の投稿にある DatabaseTransactionAdapter の実装は、うまく機能しているようです。それを呼び出す私のコードは次のとおりです。

Store.DBDataContext dc = new Store.DBDataContext();
using (TransactionScope transaction = new TransactionScope())
{
    try
    {
        var dbAdapter = new DatabaseTransactionAdapter(dc.Connection);
        dc.Connection.Open();
        dbAdapter.Begin();
        dc.Transaction = (SqlTransaction)dbAdapter.Transaction;
        Store.Product product = GetProduct("foo");
        dc.InsertOnSubmit(product);
        dc.SubmitChanges();
        transaction.Complete();
    }
    catch (Exception ex)
    {                
        throw ex;
    }
}

私を不安にさせる唯一のことは、「using」ステートメント内で宣言されていないにもかかわらず、接続を明示的に閉じていないことです。

しかし、Florin Lazar によれば、それは意図的なものです。

また、「using」ステートメントが終了した後に発生するトランザクションが完了するまで、接続は開いたままにする必要があるため、接続を閉じてはなりません。アダプターは接続の有効期間の所有権を取得し、使用が終了すると閉じます。

于 2008-11-26T15:52:21.520 に答える
0

- サーバー構成ガイド ネットワーク COM+ アクセスを有効にする (Windows Server 2003) スタート ==> コントロール パネル ==> プログラムの追加と削除 ==> Windows コンポーネントの追加と削除、[アプリケーション サーバー] を選択し、[詳細] をクリックします。[ネットワーク COM+ アクセスを有効にする] をクリックし、[OK] をクリックします。[次へ] をクリックし、[完了] をクリックします。
- 2 つのサーバー間にファイアウォールがある場合は、この範囲のポートで入出力の両方に対してファイアウォールを開きます。[スタート] ==> [コントロール パネル] ==> [管理ツール] ==> [コンポーネント サービス] をクリックします。[コンポーネント サービス] を展開し、[コンピューター] を展開します。[マイ コンピューター] を右クリックし、[プロパティ] を選択します。[マイ コンピュータのプロパティ] ウィンドウで、[既定のプロトコル] タブをクリックし、[接続指向の TCP/IP] をクリックして、プロパティを選択します。新しいウィンドウで、[追加] をクリックして、新しい DTC ポート範囲を入力します。[OK] をクリックしてこれらの変更を適用します。新しい変更を有効にするには、サーバーを再起動する必要があります

于 2009-03-26T07:01:02.740 に答える