我可以通过尝试在一个相同的连接中打开 2 个连接来成功重现这一点TransactionScope
(即使第一个连接在打开下一个连接之前也已关闭),如下所示:
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
我不太确定我做错了什么或者OracleManagedDataAccess
至少在.NET Standard
. 我的项目针对 .NET Standard 2.0 (lib) 和 .NET Core (app) 2.2,OracleManagedDataAccess
通过 nuget 安装(当然针对 .NET Standard)并且版本为2.19.3
.
这是上面发布的异常的堆栈跟踪:
在 OracleInternal.MTS.MTSRMManager.CCPEnlistTransaction(OracleConnectionImpl connImpl, Transaction transaction, MTSTxnRM txnRM.PoolManager`OracleInBranchConnectionPx) 上的 OracleInternal.MTS.MTSRMManager.CCPEnlistDistributedTxnToSysTxn(OracleConnectionImpl connImpl, Transaction txn, MTSTxnRM txnRM, MTSTxnBranch
txnBranch
) .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。打开()
我有一种感觉,这是一个非常棘手的问题,几乎取决于OracleManagedDataAccess
. 如果我不能使用TransactionScope
,将没有简单的方法来实现Ambient transaction
。