【问题标题】:TransactionInterop.GetDtcTransaction() throws ArgumentNullException... sometimesTransactionInterop.GetDtcTransaction() 有时会抛出 ArgumentNullException ...
【发布时间】:2012-04-30 18:28:30
【问题描述】:

我偶尔会遇到此异常,并且似乎无法在 SO 或 google 上找到任何可以了解如何调试此异常的信息。

System.ArgumentNullException: Value cannot be null.
Parameter name: transaction
   at System.Transactions.TransactionInterop.
                        GetDtcTransaction(Transaction transaction)
   at Oracle.DataAccess.Client.OracleConnection.Open()
   at RetrieveMessage() ...

我的代码相当简单。 RetrieveMessage() 是从队列中弹出消息的调用,但这无关紧要,因为尝试打开连接时失败。

using (var scope = new TransactionScope(TransactionScopeOption.Required,
                                            TimeSpan.FromMinutes(10)))
{
    message = RetrieveMessage();
    // ...
    scope.Complete();
}

//...

public Message RetrieveMessage()
{
    using (var cnn = new OracleConnection(ConnString))
    {
        cnn.Open(); //sometimes fails???
        //... execute a stored procedure that calls dbms_aq.dequeue()
    }
    //... return dequeued message or null if queue is empty
}

我的连接字符串如下所示:Data Source=abc;User ID=test1;Password=test1;Pooling=true;Validate Connection=True

ODP.NET:版本 2.112.1.0,.NET Framework 3.5 SP0

我已经明确创建了一个事务,为什么没有可用的事务?

【问题讨论】:

  • 这是完整的堆栈还是您跳过了一些帧?您使用的是什么版本的 ODP.NET?另外,你能给我们你的连接字符串吗?你需要交易登记吗?
  • 我们能看到RetrieveMessage() 方法的主体吗?在某些OracleConnection 实例上必须有一行显示.Open()。该实例是如何设置的?
  • Simon,Jeppe,我已添加您要求的信息。没有省略额外的帧,我列出了我的连接字符串和 ODP.NET 版本。

标签: c# oracle transactions transactionscope distributed-transactions


【解决方案1】:

我相信当客户端尝试使用的 TCP 端口被数据库服务器或客户端以外的代理关闭时会发生这种情况。我们已经能够通过使用 TCPView 关闭客户端和服务器之间端口 1521 上的所有连接,然后尝试在同一进程中打开连接来模拟这一点。在现实世界中,我们认为内部防火墙由于不活动而关闭了连接。但是,除了防止连接被关闭之外,我还没有找到解决这个问题的实际方法。

【讨论】:

    【解决方案2】:

    如果只是有时会失败,请尝试以下操作:

    while (true){
        if (ConnString == null)
            continue;
        var cnn = new OracleConnection(ConnString);
        if (cnn == null)
            continue;
        cnn.Open()
        //... execute a stored procedure that calls dbms_aq.dequeue() 
        break;
    }
    //... return dequeued message or null if queue is empty
    

    抱歉,我对“交易”了解不多,只能提供帮助

    【讨论】:

    • 感谢您为回答所付出的努力,但我的代码引发了异常,因此这并不是一个完整的解决方案。此外,无论如何,我没有理由阻止像这样的紧密自旋循环 - 最糟糕的是,您的代码可能会按照当前编写的方式使 CPU 达到峰值。理想情况下,我想了解异常的原因并修复该场景,使其根本不会抛出异常。您的回答确实值得一票否决....但我会留下它。
    • 实际上 m12 在这里鼓励投票机制......虽然评论有助于改进帖子,但不应期望它是强制性的。另请记住,通常否决票来自其他用户,而不是问题的发布者。这里有很多关于 SO 的专家,所以如果你承认你对某个主题不太了解,最好留给其他人 - 或者准备好反对。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多