【发布时间】:2019-10-30 10:29:35
【问题描述】:
我可以通过尝试在同一个 TransactionScope 中打开 2 个连接来成功重现这一点(即使第一个在打开下一个之前已关闭),如下所示:
var connectionString = "some connection";
using (var t = new TransactionScope())
{
using (var con1 = new OracleConnection(connectionString))
{
con1.Open();
}
using (var con2 = new OracleConnection(connectionString))
{
con2.Open();//exception thrown at here
}
}
实际上,我正在尝试利用TransactionScope 为我的存储库实现某种Ambient transaction(每个存储库都使用一个相同的连接字符串打开自己的连接)。上面的代码被尽可能地简化以帮助重现异常。
我不太确定我做错了什么,或者TransactionScope 至少在.NET Standard 中不受OracleManagedDataAccess 的支持。
我的项目针对 .NET Standard 2.0 (lib) 和 .NET Core (app) 2.2,OracleManagedDataAccess 是通过 nuget 安装的(当然是针对 .NET Standard),版本为 2.19.3。
这是上面发布的异常的堆栈跟踪:
在 OracleInternal.MTS.MTSRMManager.CCPEnlistDistributedTxnToSysTxn(OracleConnectionImpl connImpl, Transaction txn, MTSTxnRM txnRM, MTSTxnBranch txnBranch)
在 OracleInternal.MTS.MTSRMManager.CCPEnlistTransaction(OracleConnectionImpl connImpl,事务事务,MTSTxnRM txnRM,MTSTxnBranch txnBranch)
在 OracleInternal.ConnectionPool.PoolManager`3.GetEnlisted(ConnectionString csWithDiffOrNewPwd, Boolean bGetForApp, OracleConnection connRefForCriteria)
在 OracleInternal.ConnectionPool.OracleConnectionDispenser`3.Get(ConnectionString cs、PM conPM、ConnectionString pmCS、SecureString securePassword、SecureString secureProxyPassword、OracleConnection connRefForCriteria)
在 Oracle.ManagedDataAccess.Client.OracleConnection.Open()
我感觉这是一个非常棘手的问题,几乎取决于OracleManagedDataAccess。如果我不能使用TransactionScope,就没有简单的方法来实现Ambient transaction。
【问题讨论】:
标签: c# oracle transactions transactionscope oracle-manageddataaccess