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?
您不应该使用内部 Transaction 对象,TransactionScope创建已经执行了该操作,并且该方法执行了提交,不需要Complete内部调用BeginTransaction和方法调用。Commit
如果按照这个方法的话,效果如何呢?
| 归档时间: |
|
| 查看次数: |
11318 次 |
| 最近记录: |