2012-01-11 9 views
0

フォーム・データをOracle表に挿入するトランザクションがいくつかあります。WebサービスでのOracle Transaction Rollback

if (InsertQuarterly() == true) 
      { 
       InsertMeasures(); 
      } 

そしてinsertmeasures手順が正常に実行された場合、私は別のプロシージャを呼び出す必要があります。 InsertQuarterly以内に私は、例えば

sOUT = ws_service.InsertQuarterly(txtQ2dTarget.Text, txtQ3dTarget.Text) 

は、Oracleのテーブル にデータを挿入するWebサービスメソッドを呼び出していますし、InsertMeasuresのために、私はInsertQuarterlyが正常に実行された場合私の問題がある

sOUT = ws_service.InsertMeasures(txtachieveGold.Text, txtachieveDia.Text) 

Webサービスを呼び出すことが、InsertMeasuresが失敗した場合していますトランザクション中に私はロールバックしたいInsertQuarterlyもあります。 これをどうすれば実現できますか?私はOracleTransactiontransaction.Rollback()を使うことができます。 しかし、トランザクションのために異なるWebサービスメソッドを使用しています。 ロールバックを管理し、ここでコミットする方法?

トランザクションを処理する最善の手順は何ですか?

答えて

0

Webサービスプロバイダの協力が必要です。

サービスプロバイダは、サービス呼び出しがサービス呼び出しを介してトランザクション動作を提供できるようにします。私の経験では、比較的少数のサービス作成者がトランザクション性をサポートしています。あなたが使用するサービスがそのような機能を提供している場合は、ご使​​用の環境でWS-AtomicTransactionを使用する方法の詳細をお読みください。

しかし、このようなトランザクションサービスを提供するにはかなりのオーバーヘッドと操作上の複雑さがあります。なぜなら、そうした理由がある人はほとんどいません。私の好ましい解決策は、InsertQuarterlyとInsertMeuresの機能を組み合わせた単一の大雑把なサービスを提供することです。その実装は、単一のサービス呼び出しでOracleトランザクションを非常に簡単に管理できます。

さらに、複数の呼び出しが安全に繰り返されるまで、クライアントはInsertQuarterly()とInsertMeasures()を繰り返し呼び出す責任があります。サービスが冪等である場合。

これらのアプローチはすべて、サービスプロバイダに適切なアプローチを実装する必要があります。クライアントコードではこの問題を解決できません。

関連する問題