4

私はしばらく前にいくつかのテストを行いましたが、これを機能させる方法がわかりませんでした。

材料:

  • COM +トランザクションオブジェクト(VB6で開発)

  • COM+コンポーネントを呼び出すIISの.NetWebアプリケーション(トランザクションあり)は
    、SQLデータベースの行を更新します

テスト:

.Netアプリケーションを実行し、例外を強制します。

結果:

.Netアプリケーションから行われた更新はロールバックされます。
COM+オブジェクトによって行われた更新はロールバックされません。

古いASPページからCOM+オブジェクトを呼び出すと、ロールバックが機能します。

「なに?!COM +や.Netは気にしないでね!」と思っている方もいらっしゃるかもしれませんが、この世界にはまだCOM+のコンポーネントがたくさんあるところがあります。誰かがこれに直面したことがあるかどうか、そしてあなたがこれを機能させる方法を理解したかどうか、私はただ興味がありました。

4

2 に答える 2

2

VB と .NET は異なる SQL 接続を使用するため (また、ADO と ADO.NET で同じ接続を共有する方法はありません)、唯一の可能性は DTC (分散トランザクション コーディネーター) を登録することです。DTC は 2 つの独立したトランザクションを調整して、それらが一緒にコミットまたはロールバックされるようにします。

.NET から、EnterpriseServices は DTC などの COM+ 機能を管理します。.NET 2.0 以降では、System.Transactions 名前空間を使用できます。これにより、処理が少し改善されます。私はこのようなものがうまくいくはずだと思います(テストされていないコード):

void SomeMethod()
{
    EnterpriseServicesInteropOption e = EnterpriseServicesInteropOption.Full;
    using (TransactionScope s = new TransactionScope(e))
    {
        MyComPlusClass o = new MyComPlusClass();

        o.SomeTransactionalMethod();
    }
}

現時点では、これ以上のアドバイスを提供できるほど詳しくありません。

COM+ 側では、分散トランザクションを使用するようにオブジェクトを構成する必要があります (ほとんどの場合、「必要」です)。これは、オブジェクトの [プロパティ] に移動し、[トランザクション] タブを選択して、 [必須] をクリックすることにより、COM+ エクスプローラーから行うことができます。コードからもこれを実行できるかどうかは覚えていません。VB6 は COM+ がリリースされる前に作成されたため、COM+ が行うことすべてを完全にサポートしているわけではありません (そのトランザクション サポートは、MS Transaction Server と呼ばれる COM+ の前身向けのものでした)。

すべてが正しく機能する場合、COM+ オブジェクトは、.NET コードによって作成された既存のコンテキストに登録されているはずです。

"Component Services" の "Distributed Transaction Coordinator\Transaction List" ノードを使用して、呼び出し中に作成された分散トランザクションを確認して確認できます。

トランザクションがコミットされるまで、.NET 側からのデータ クエリに反映された COM+ コンポーネントからの変更を確認できないことに注意してください。実際、デッドロックが発生する可能性があります。DTC は 2 つのトランザクションが対になっていることを確認しますが、それらは別個のデータベース トランザクションであることを忘れないでください。

于 2008-09-15T20:17:25.580 に答える
1

これをどのように実装していますか?EnterpriseServicesを使用して.NETトランザクションを管理している場合は、両方に同じコンテキストを使用しているため、両方のトランザクションをロールバックする必要があります。

于 2008-08-22T01:42:23.133 に答える