2009-08-31 7 views
2

SQL Serverデータベースでデータベーストランザクションを行うためのコードブロックを作成しました。実行中に何らかの障害が発生した場合は、TransactionScopeクラスを使用してすべての変更をロールバックします。 SQL SERVERを実行しているシステムでアプリケーションを実行すると問題はありません。 システムでアプリケーションを実行し、SQL Serverが別のシステムで実行されている場合、MSDTCが無効になっているというエラーが表示されます。.NETアプリケーションのTransactionScope

DBServer実行システムでMSDTCを有効にすると、アプリケーションが正常に動作しています。

私はORACLEデータベースを使用する必要がある場合、システムはどのように動作しますか?トランザクションスコープを有効にするために、ORACLE DB Serverに何か設定する必要がありますか?私を助けてください。

ありがとう、 P.Gopalakrishnan。

答えて

1

TransactionScopeは概念的にシンプルですが、背後には多くの魔法が隠れています。これにより、複数のマシンに分散された1つのトランザクションを使用できます。これを行うには、データベースからの複雑なサポートが必要です。また、オーバーヘッドが高い場合とそうでない場合があります。

DbTransactionでは、より単純な、より限定された技術で十分です。あなたのDbプロバイダは、SQLのBEGIN TRANSACTIONCOMMIT TRANSACTIONに類似したセマンティクスを持つトランザクションを実装できます。つまり、1台のマシン上で1つの接続にまたがるトランザクションです。その後、次のようになります

あなたのコード...

DbCommand cmd = ...; 
using (DbTransaction trans = Connection.BeginTransaction()) { 
    cmd.Transaction = trans; //sometimes optional, though MS-SQL requires it. 

    cmd.ExecuteNonQuery() 
    [...other db commands with the same connection and transaction...] 
    trans.Commit(); 
} 

であるためには、クリスタルクリア:トランザクションが開いているときに、いくつかの他の接続を使用することができます - しかし、それらの間にはリンクがありません。異なる接続で実行されたコマンドは、トランザクションの中止時にロールバックされません(任意のC#コードは、トランザクションの中断時にロールバックされないように)。

このアプローチは、より軽量で細かく、より広範なデータベースプロバイダで動作し、MSDTCを起動する必要はありません。反面、トランザクションは接続に固有です(複数の接続がある場合はトランザクションを共有しません)、分散することはできず、トランザクションに手動でコマンドを登録する必要があります(少なくともMSの場合-SQL)。

注:トランザクションにコマンドを登録しなかった場合、MS-SQLは例外をスローしますが、SQLiteは暗黙的にコマンドを登録します。すべてのコマンドにする必要がありますので、これはトランザクションに登録する必要があります。これは単なる冗長なAPIですが、それほど問題はありません。

0

TransactionScopeは、必要に応じてより高価な分散トランザクションに昇格させるオプションを備えた(ハイブリッド)高速ローカルトランザクションをサポートします。分散トランザクションの場合、MSDTCが必要です。

分散トランザクションへの昇格理由は、同じTransactionScopeに2番目のデータベースが関与している場合です。

Oracle Data Providerバージョン10.2.0.3以上は、ローカル・トランザクション+分散トランザクション(SQL Server 2005以上と同じ)をサポートしています。古いバージョンのODP.NETは分散トランザクションのみをサポートしています。