事务范围因Oracle中的BeginTransaction而失败:Connection已经是本地或分布式事务的一部分

adt*_*adt 6 c# oracle odp.net transactionscope

使用OracleConnection与TransactionScope时出现这种奇怪的行为.如果我尝试在事务范围中使用connection.BeginTransaction(),我会得到简单优雅的InvalidOperationException:Connection已经是本地或分布式事务的一部分.

这是一些代码:

var trxOptions = new TransactionOptions();
 trxOptions.IsolationLevel = IsolationLevel.ReadCommitted;
 using (var transaction = new TransactionScope(TransactionScopeOption.Required,trxOptions))
            {

                var c = ConfigurationManager.ConnectionStrings["oracle_test"].ConnectionString;
                using (var oracle = new OracleConnection(c))
                {
                    oracle.Open();
                    using (var tr = oracle.BeginTransaction(System.Data.IsolationLevel.ReadCommitted))
                    {
                        var cmd = oracle.CreateCommand();
                        cmd.CommandText = "INSERT INTO simple_user VALUES('a')";

                        cmd.ExecuteNonQuery();
                        tr.Commit();
                    }
                }


        // now go to sql server and insert data
       transaction.Complete();
Run Code Online (Sandbox Code Playgroud)

}

如果我不使用BeginTransaction一切正常.有什么想法让它发挥作用?

PS:我在Sql Server上没有这样的问题.

编辑

谢谢你的答案,我想我应该添加一些编辑,以使我的问题清楚.

首先,我上面提供的代码是问题的证明.让我说我有两个DLL的MyProject.Oracle.dll和MyProject2.MsSql.dll,我想使用这些DLL中的方法,他们使用db.BeginTransaction().如果这些dll使用了TransactionScope,我的外部事务就不会成为问题.分配交易将在没有任何问题的情况下处理.但我不能改变dll中的代码.

为什么db.BeginTransaction()适用于SqlServer而不适用于Oracle?

Dav*_*ras 0

您不应该使用内部 Transaction 对象,TransactionScope创建已经执行了该操作,并且该方法执行了提交,不需要Complete内部调用BeginTransaction和方法调用。Commit

如果按照这个方法的话,效果如何呢?