c# - TransactionInterop.GetDtcTransaction() 抛出 ArgumentNullException ... 有时

标签 c# oracle transactions transactionscope distributed-transactions

我偶尔会遇到这个异常,而且似乎无法在 SO 或谷歌上找到任何可以揭示如何调试它的信息。

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

为什么我已经明确创建了交易,却没有可用的交易?

最佳答案

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

关于c# - TransactionInterop.GetDtcTransaction() 抛出 ArgumentNullException ... 有时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10388671/

相关文章:

c# - 为什么我的 WebClient 大多数时候返回 404 错误,但并非总是如此?

c# - 与委托(delegate)一起解释这段代码

sql - 如何防止 dbms_output.put_line 修剪前导空格?

mysql - 一个事务中的两个查询并带有回滚

c# - winforms应用程序中的多线程

c# - 正则表达式匹配整数

sql - 如何解决Oracle错误ORA-01790?

sql - 从 oracle 数据库表中生成带有自定义 XML 标记的 XML 文件

php - 使用 PHP 和 Laravel 的 Paypal API

coldfusion - cftransaction 和 cfincludes