3

SilverlightおよびRIAサービスに基づくプロジェクト内でTransactionScopeクラスを使用しています。データを保存する必要があるたびに、TransactionScopeオブジェクトを作成し、Oracle ODPを使用してデータを保存してから、TransactionScopeオブジェクトのCompleteメソッドを呼び出し、オブジェクト自体を破棄します。

public override bool Submit(ChangeSet changeSet)
    {
        TransactionOptions txopt = new TransactionOptions();
        txopt.IsolationLevel = IsolationLevel.ReadCommitted;
        using (TransactionScope tx = new TransactionScope(TransactionScopeOption.Required, txopt))
        {
            // Here I open an Oracle connection and fetch some data
            GetSomeData();

            // This is where I persist my data
            result = base.Submit(changeSet);

            tx.Complete();
        }

        return result;
    }

私の問題は、Submitメソッドを最初に呼び出すときはすべて問題ありませんが、2回目に呼び出すと、Completeの呼び出し後数分間実行がスタックします(つまり、txを破棄するとき) 、その後、Oracleエラー「ORA-12154」が発生します。もちろん、永続化コードがエラーなしで完了することをすでに確認しました。何か案は?

編集:今日、私はテストを繰り返しましたが、何らかの理由で、Oracle例外の代わりに別のエラーが発生します:

System.InvalidOperationException: Operation is not valid due to the current state of the object.
at System.Transactions.TransactionState.ChangeStatePromotedAborted(InternalTransaction tx)
at System.Transactions.InternalTransaction.DistributedTransactionOutcome(InternalTransaction tx, TransactionStatus status)
at System.Transactions.Oletx.RealOletxTransaction.FireOutcome(TransactionStatus statusArg)
at System.Transactions.Oletx.OutcomeEnlistment.InvokeOutcomeFunction(TransactionStatus status)
at System.Transactions.Oletx.OletxTransactionManager.ShimNotificationCallback(Object state, Boolean timeout)
at System.Threading._ThreadPoolWaitOrTimerCallback.PerformWaitOrTimerCallback(Object state, Boolean timedOut)
4

1 に答える 1

1

そもそも問題が発生した理由はまだわかりませんが、どういうわけかこの問題を解決できました。GetSomeDataへの呼び出しを分散トランザクションの範囲外に移動しただけです。Submitの呼び出しは多くの接続を開き、DBであらゆる種類の操作を実行する可能性があるため、GetSomeDataがこの問題を引き起こした理由がわかりません(接続を開き、非常に単純なストアド関数を呼び出してブール値を返します)。これは、Submitメソッドの実装、および/または同じトランザクションスコープ内の複数のOracle接続のインスタンス化と関係があると推測できます。

于 2012-10-30T13:23:01.087 に答える