【问题标题】:Oracle.ManagedDataAccess.Core - Transaction Scope IssueOracle.ManagedDataAccess.Core - 事务范围问题
【发布时间】:2019-11-29 04:37:50
【问题描述】:

我正在尝试将一个项目转换为 .Net Core,但遇到了一个绊脚石。

当我在事务范围内打开两个不同的 oracle 连接时,收到以下错误:

"Operation is not supported on this platform."

"   at OracleInternal.MTS.MTSRMManager.CCPEnlistDistributedTxnToSysTxn(OracleConnectionImpl connImpl, Transaction txn, MTSTxnRM txnRM, MTSTxnBranch txnBranch)

   at OracleInternal.MTS.MTSRMManager.CCPEnlistTransaction(OracleConnectionImpl connImpl, Transaction transaction, MTSTxnRM txnRM, MTSTxnBranch txnBranch)

   at OracleInternal.ConnectionPool.PoolManager`3.GetEnlisted(ConnectionString csWithDiffOrNewPwd, Boolean bGetForApp, OracleConnection connRefForCriteria)

   at OracleInternal.ConnectionPool.OracleConnectionDispenser`3.Get(ConnectionString cs, PM conPM, ConnectionString pmCS, SecureString securedPassword, SecureString securedProxyPassword, OracleConnection connRefForCriteria)

   at Oracle.ManagedDataAccess.Client.OracleConnection.Open()"

以下代码在打开第二个连接时会导致此错误。 此外,这不会发生在标准框架 Oracle.ManagedDataAccess 上。它只发生在 Oracle.ManagedDataAccess.Core 版本上。

我的猜测是它看起来与连接池有关,但我可以使用一些帮助。

如果您对每个连接使用相同的连接字符串,则没有问题。仅当您有两个不同的连接时才会发生。

    using (TransactionScope scope = new TransactionScope())
    {
        using (var conn = new OracleConnection(connectionString1))
        {
              conn.Open();
        }

        using (var conn = new OracleConnection(connectionString2))
        {
             conn.Open(); //Exception occurs here
        }

       scope.Complete();
    }

【问题讨论】:

    标签: c# oracle core


    【解决方案1】:

    根据the docs

    ODP.NET Core 不支持分布式事务。

    因此为什么“此平台不支持操作。”

    如果您对每个连接使用相同的连接字符串,则没有 问题。仅当您有两个不同的连接时才会发生。

    如果您只使用单个连接,那么您就可以了,因为您没有使用分布式事务。但是,一旦您拥有多个,就会涉及Distributed Transaction(ODP.NET Core 不支持)。这与您所看到的一致。

    【讨论】:

    • 谢谢,对不起,关于信息的重要部分让我漏掉了。关于如何解决这个问题的任何建议?猜猜它要么坚持使用 .Net4.7,要么尝试使用另一个 Oracle 供应商的 .Net Core? Devart 好像提供Oracle Core 支持? devart.com/dotconnect/oracle/docs/UsingTransactions.html
    • 是的,它们似乎是你的选择@Steve。
    • @Steve 嘿,在我的工作中,我们面临着类似的问题,我不喜欢将应用程序从 donet 核心移植回 .Net 的想法。我想知道,您是否解决了问题以及如何解决?我也想知道 Devart 库的免费版本是否支持 Oracle 的分布式事务。
    • 我不确定免费版本,但付费的 Devart Oracle .Net Core 适配器没有产生错误,所以我们就这样做了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-15
    • 1970-01-01
    • 2018-08-18
    • 2021-06-19
    • 1970-01-01
    • 2010-10-15
    相关资源
    最近更新 更多