TransactionScope释放失败

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方法时一切正常,但如果我第二次调用它,执行会在Complete调用后(也就是tx释放之后)卡住几分钟,然后我会得到"ORA-12154"的Oracle错误。当然,我已经检查过持久化代码没有错误。有什么想法吗?
编辑:今天我重复了测试,不知何故,我收到了一个与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)

你是否正确安装了 OracleMTSRecoveryService 或者是仅本地的 TNS 设置?因为你说有一个“第二个”调用,我猜测你可能需要分布式事务设置而不是仅本地的,这将需要 OracleMTSRecoveryService - Anjan Biswas
@Annjawn 是的,我已经安装并运行了OracleMTSRecoveryService。不过今天我有了新的细节(请参见上文)。 - Sue Maurizio
1个回答

1
我设法解决了这个问题,尽管我仍然无法弄清楚它首先出现的原因:我只是将对GetSomeData的调用移动到分布式事务范围之外。由于对Submit的调用可能会打开许多连接并在DB上执行任何类型的操作,所以我无法告诉为什么GetSomeData会导致这个问题(它只是打开一个连接,调用一个非常简单的存储函数并返回一个布尔值)。我只能猜测这与Submit方法的实现和/或在同一事务范围内实例化多个Oracle连接有关。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接